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\Autoloader\ServiceContainer;
13 use Behat\Testwork\Cli\ServiceContainer\CliExtension;
14 use Behat\Testwork\ServiceContainer\Extension;
15 use Behat\Testwork\ServiceContainer\ExtensionManager;
16 use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
17 use Symfony\Component\DependencyInjection\ContainerBuilder;
18 use Symfony\Component\DependencyInjection\Definition;
19 use Symfony\Component\DependencyInjection\Reference;
22 * Extends Testwork with class-loading services.
24 * @author Konstantin Kudryashov <ever.zet@gmail.com>
26 final class AutoloaderExtension implements Extension
31 const CLASS_LOADER_ID = 'class_loader';
36 private $defaultPaths = array();
39 * Initializes extension.
41 * @param array $defaultPaths
43 public function __construct(array $defaultPaths = array())
45 $this->defaultPaths = $defaultPaths;
49 * Returns the extension config key.
53 public function getConfigKey()
61 public function initialize(ExtensionManager $extensionManager)
68 public function configure(ArrayNodeDefinition $builder)
71 ->beforeNormalization()
72 ->ifString()->then(function ($path) {
73 return array('' => $path);
77 ->defaultValue($this->defaultPaths)
78 ->treatTrueLike($this->defaultPaths)
79 ->treatNullLike(array())
80 ->treatFalseLike(array())
82 ->prototype('scalar')->end()
89 public function load(ContainerBuilder $container, array $config)
91 $this->loadAutoloader($container);
92 $this->loadController($container);
93 $this->setLoaderPrefixes($container, $config);
99 public function process(ContainerBuilder $container)
101 $this->processLoaderPrefixes($container);
105 * Loads Symfony2 autoloader.
107 * @param ContainerBuilder $container
109 private function loadAutoloader(ContainerBuilder $container)
111 $definition = new Definition('Symfony\Component\ClassLoader\ClassLoader');
112 $container->setDefinition(self::CLASS_LOADER_ID, $definition);
118 * @param ContainerBuilder $container
120 private function loadController(ContainerBuilder $container)
122 $definition = new Definition('Behat\Testwork\Autoloader\Cli\AutoloaderController', array(
123 new Reference(self::CLASS_LOADER_ID)
125 $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 9999));
127 $container->setDefinition(CliExtension::CONTROLLER_TAG . '.autoloader', $definition);
131 * Sets provided prefixes to container.
133 * @param ContainerBuilder $container
134 * @param array $prefixes
136 private function setLoaderPrefixes(ContainerBuilder $container, array $prefixes)
138 $container->setParameter('class_loader.prefixes', $prefixes);
142 * Processes container loader prefixes.
144 * @param ContainerBuilder $container
146 private function processLoaderPrefixes(ContainerBuilder $container)
148 $loaderDefinition = $container->getDefinition(self::CLASS_LOADER_ID);
149 $loaderDefinition->addMethodCall('addPrefixes', array($container->getParameter('class_loader.prefixes')));