vendor/php-task/task-bundle/src/DependencyInjection/TaskExtension.php line 151
<?php
/*
* This file is part of php-task library.
*
* (c) php-task
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace Task\TaskBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Task\Event\Events;
use Task\TaskBundle\EventListener\DoctrineTaskExecutionListener;
/**
* Container extension for php-task library.
*/
class TaskExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = $this->getConfiguration($configs, $container);
$config = $this->processConfiguration($configuration, $configs);
$container->setParameter('task.system_tasks', $config['system_tasks']);
$container->setAlias('task.lock.storage', $configuration->getLockingStorageId($config['locking']['storage']));
foreach (array_keys($config['locking']['storages']) as $key) {
$container->setParameter('task.lock.storages.' . $key, $config['locking']['storages'][$key]);
}
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load(sprintf('storage/%s.xml', $config['storage']));
$loader->load('task_event_listener.xml');
$loader->load('scheduler.xml');
$loader->load('command.xml');
$loader->load('locking/services.xml');
if ($config['run']['mode'] === 'listener') {
$loader->load('listener.xml');
}
$this->loadDoctrineAdapter($config['adapters']['doctrine'], $container);
$this->loadLockingComponent($config['locking'], $container, $loader);
$this->loadExecutorComponent($config['executor'], $container, $loader);
}
/**
* Load doctrine adapter.
*
* @param array $config
* @param ContainerBuilder $container
*/
private function loadDoctrineAdapter(array $config, ContainerBuilder $container)
{
if ($config['clear']) {
$definition = new Definition(
DoctrineTaskExecutionListener::class,
[new Reference('doctrine.orm.entity_manager', ContainerInterface::IGNORE_ON_INVALID_REFERENCE)]
);
$definition->addTag(
'kernel.event_listener',
['event' => Events::TASK_AFTER, 'method' => 'clearEntityManagerAfterTask']
);
$container->setDefinition('task.adapter.doctrine.execution_listener', $definition);
}
}
/**
* Load services for locking component.
*
* @param array $config
* @param LoaderInterface $loader
* @param ContainerBuilder $container
*/
private function loadLockingComponent(array $config, ContainerBuilder $container, LoaderInterface $loader)
{
if (!$config['enabled'] || 'null' === $config['storage']) {
return $loader->load('locking/null.xml');
}
$loader->load('locking/services.xml');
$container->setParameter('task.lock.ttl', $config['ttl']);
}
/**
* Load services for executor component.
*
* @param array $config
* @param LoaderInterface $loader
* @param ContainerBuilder $container
*/
private function loadExecutorComponent(array $config, ContainerBuilder $container, LoaderInterface $loader)
{
$loader->load('executor/' . $config['type'] . '.xml');
$container->setAlias('task.executor', 'task.executor.' . $config['type']);
if (!array_key_exists($config['type'], $config)) {
return;
}
foreach ($config[$config['type']] as $key => $value) {
$container->setParameter('task.executor.' . $key, $value);
}
if (!file_exists($container->getParameter('task.executor.console_path'))) {
throw new InvalidConfigurationException(
'Console file does not exists! Given in "task.executor.seperate.console".'
);
}
}
/**
* Find storage aliases and related ids.
*
* @param ContainerBuilder $container
*
* @return array
*/
private function getLockingStorageAliases(ContainerBuilder $container)
{
$taggedServices = $container->findTaggedServiceIds('task.lock.storage');
$result = ['null'];
foreach ($taggedServices as $id => $tags) {
foreach ($tags as $tag) {
$result[$tag['alias']] = $id;
}
}
return $result;
}
/**
* {@inheritdoc}
*/
public function getConfiguration(array $config, ContainerBuilder $container)
{
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('locking/storages.xml');
return new Configuration($this->getLockingStorageAliases($container));
}
}