4 * This file is part of the Behat Testwork.
5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
11 namespace Behat\Testwork\Environment\ServiceContainer;
13 use Behat\Testwork\ServiceContainer\Extension;
14 use Behat\Testwork\ServiceContainer\ExtensionManager;
15 use Behat\Testwork\ServiceContainer\ServiceProcessor;
16 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
18 use Symfony\Component\DependencyInjection\Definition;
21 * Testwork test environment extension.
23 * Extends testwork with environment services.
25 * @author Konstantin Kudryashov <ever.zet@gmail.com>
27 final class EnvironmentExtension implements Extension
32 const MANAGER_ID = 'environment.manager';
35 * Available extension points
37 const HANDLER_TAG = 'environment.handler';
38 const READER_TAG = 'environment.reader';
41 * @var ServiceProcessor
46 * Initializes extension.
48 * @param null|ServiceProcessor $processor
50 public function __construct(ServiceProcessor $processor = null)
52 $this->processor = $processor ? : new ServiceProcessor();
58 public function getConfigKey()
60 return 'environments';
66 public function initialize(ExtensionManager $extensionManager)
73 public function configure(ArrayNodeDefinition $builder)
80 public function load(ContainerBuilder $container, array $config)
82 $this->loadManager($container);
83 $this->loadStaticEnvironmentHandler($container);
89 public function process(ContainerBuilder $container)
91 $this->processHandlers($container);
92 $this->processReaders($container);
96 * Loads environment manager.
98 * @param ContainerBuilder $container
100 protected function loadManager(ContainerBuilder $container)
102 $definition = new Definition('Behat\Testwork\Environment\EnvironmentManager');
103 $container->setDefinition(self::MANAGER_ID, $definition);
107 * Loads static environments handler.
109 * @param ContainerBuilder $container
111 protected function loadStaticEnvironmentHandler(ContainerBuilder $container)
113 $definition = new Definition('Behat\Testwork\Environment\Handler\StaticEnvironmentHandler');
114 $definition->addTag(self::HANDLER_TAG, array('priority' => 0));
115 $container->setDefinition(self::HANDLER_TAG . '.static', $definition);
119 * Processes all environment handlers.
121 * @param ContainerBuilder $container
123 protected function processHandlers(ContainerBuilder $container)
125 $references = $this->processor->findAndSortTaggedServices($container, self::HANDLER_TAG);
126 $definition = $container->getDefinition(self::MANAGER_ID);
128 foreach ($references as $reference) {
129 $definition->addMethodCall('registerEnvironmentHandler', array($reference));
134 * Processes all environment readers.
136 * @param ContainerBuilder $container
138 protected function processReaders(ContainerBuilder $container)
140 $references = $this->processor->findAndSortTaggedServices($container, self::READER_TAG);
141 $definition = $container->getDefinition(self::MANAGER_ID);
143 foreach ($references as $reference) {
144 $definition->addMethodCall('registerEnvironmentReader', array($reference));