vendor/php-task/task-bundle/src/DependencyInjection/TaskExtension.php line 151

  1. <?php
  2. /*
  3.  * This file is part of php-task library.
  4.  *
  5.  * (c) php-task
  6.  *
  7.  * This source file is subject to the MIT license that is bundled
  8.  * with this source code in the file LICENSE.
  9.  */
  10. namespace Task\TaskBundle\DependencyInjection;
  11. use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
  12. use Symfony\Component\Config\FileLocator;
  13. use Symfony\Component\Config\Loader\LoaderInterface;
  14. use Symfony\Component\DependencyInjection\ContainerBuilder;
  15. use Symfony\Component\DependencyInjection\ContainerInterface;
  16. use Symfony\Component\DependencyInjection\Definition;
  17. use Symfony\Component\DependencyInjection\Loader;
  18. use Symfony\Component\DependencyInjection\Reference;
  19. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  20. use Task\Event\Events;
  21. use Task\TaskBundle\EventListener\DoctrineTaskExecutionListener;
  22. /**
  23.  * Container extension for php-task library.
  24.  */
  25. class TaskExtension extends Extension
  26. {
  27.     /**
  28.      * {@inheritdoc}
  29.      */
  30.     public function load(array $configsContainerBuilder $container)
  31.     {
  32.         $configuration $this->getConfiguration($configs$container);
  33.         $config $this->processConfiguration($configuration$configs);
  34.         $container->setParameter('task.system_tasks'$config['system_tasks']);
  35.         $container->setAlias('task.lock.storage'$configuration->getLockingStorageId($config['locking']['storage']));
  36.         foreach (array_keys($config['locking']['storages']) as $key) {
  37.             $container->setParameter('task.lock.storages.' $key$config['locking']['storages'][$key]);
  38.         }
  39.         $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ '/../Resources/config'));
  40.         $loader->load(sprintf('storage/%s.xml'$config['storage']));
  41.         $loader->load('task_event_listener.xml');
  42.         $loader->load('scheduler.xml');
  43.         $loader->load('command.xml');
  44.         $loader->load('locking/services.xml');
  45.         if ($config['run']['mode'] === 'listener') {
  46.             $loader->load('listener.xml');
  47.         }
  48.         $this->loadDoctrineAdapter($config['adapters']['doctrine'], $container);
  49.         $this->loadLockingComponent($config['locking'], $container$loader);
  50.         $this->loadExecutorComponent($config['executor'], $container$loader);
  51.     }
  52.     /**
  53.      * Load doctrine adapter.
  54.      *
  55.      * @param array $config
  56.      * @param ContainerBuilder $container
  57.      */
  58.     private function loadDoctrineAdapter(array $configContainerBuilder $container)
  59.     {
  60.         if ($config['clear']) {
  61.             $definition = new Definition(
  62.                 DoctrineTaskExecutionListener::class,
  63.                 [new Reference('doctrine.orm.entity_manager'ContainerInterface::IGNORE_ON_INVALID_REFERENCE)]
  64.             );
  65.             $definition->addTag(
  66.                 'kernel.event_listener',
  67.                 ['event' => Events::TASK_AFTER'method' => 'clearEntityManagerAfterTask']
  68.             );
  69.             $container->setDefinition('task.adapter.doctrine.execution_listener'$definition);
  70.         }
  71.     }
  72.     /**
  73.      * Load services for locking component.
  74.      *
  75.      * @param array $config
  76.      * @param LoaderInterface $loader
  77.      * @param ContainerBuilder $container
  78.      */
  79.     private function loadLockingComponent(array $configContainerBuilder $containerLoaderInterface $loader)
  80.     {
  81.         if (!$config['enabled'] || 'null' === $config['storage']) {
  82.             return $loader->load('locking/null.xml');
  83.         }
  84.         $loader->load('locking/services.xml');
  85.         $container->setParameter('task.lock.ttl'$config['ttl']);
  86.     }
  87.     /**
  88.      * Load services for executor component.
  89.      *
  90.      * @param array $config
  91.      * @param LoaderInterface $loader
  92.      * @param ContainerBuilder $container
  93.      */
  94.     private function loadExecutorComponent(array $configContainerBuilder $containerLoaderInterface $loader)
  95.     {
  96.         $loader->load('executor/' $config['type'] . '.xml');
  97.         $container->setAlias('task.executor''task.executor.' $config['type']);
  98.         if (!array_key_exists($config['type'], $config)) {
  99.             return;
  100.         }
  101.         foreach ($config[$config['type']] as $key => $value) {
  102.             $container->setParameter('task.executor.' $key$value);
  103.         }
  104.         if (!file_exists($container->getParameter('task.executor.console_path'))) {
  105.             throw new InvalidConfigurationException(
  106.                 'Console file does not exists! Given in "task.executor.seperate.console".'
  107.             );
  108.         }
  109.     }
  110.     /**
  111.      * Find storage aliases and related ids.
  112.      *
  113.      * @param ContainerBuilder $container
  114.      *
  115.      * @return array
  116.      */
  117.     private function getLockingStorageAliases(ContainerBuilder $container)
  118.     {
  119.         $taggedServices $container->findTaggedServiceIds('task.lock.storage');
  120.         $result = ['null'];
  121.         foreach ($taggedServices as $id => $tags) {
  122.             foreach ($tags as $tag) {
  123.                 $result[$tag['alias']] = $id;
  124.             }
  125.         }
  126.         return $result;
  127.     }
  128.     /**
  129.      * {@inheritdoc}
  130.      */
  131.     public function getConfiguration(array $configContainerBuilder $container)
  132.     {
  133.         $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__ '/../Resources/config'));
  134.         $loader->load('locking/storages.xml');
  135.         return new Configuration($this->getLockingStorageAliases($container));
  136.     }
  137. }