diff --git a/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php index a173f488f2c1..cb028212a254 100755 --- a/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php +++ b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php @@ -30,6 +30,28 @@ */ class DoctrineExtension extends AbstractDoctrineExtension { + public function load(array $configs, ContainerBuilder $container) + { + $dbal = $orm = array(); + foreach ($configs as $config) { + if (isset($config['dbal'])) { + $dbal[] = $config['dbal']; + } + + if (isset($config['orm'])) { + $orm[] = $config['orm']; + } + } + + if (!empty($dbal)) { + $this->dbalLoad($dbal, $container); + } + + if (!empty($orm)) { + $this->ormLoad($orm, $container); + } + } + /** * Loads the DBAL configuration. * @@ -40,7 +62,7 @@ class DoctrineExtension extends AbstractDoctrineExtension * @param array $config An array of configuration settings * @param ContainerBuilder $container A ContainerBuilder instance */ - public function dbalLoad(array $configs, ContainerBuilder $container) + protected function dbalLoad(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('dbal.xml'); @@ -230,7 +252,7 @@ protected function loadDbalConnection(array $connection, ContainerBuilder $conta * @param array $config An array of configuration settings * @param ContainerBuilder $container A ContainerBuilder instance */ - public function ormLoad(array $configs, ContainerBuilder $container) + protected function ormLoad(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('orm.xml'); diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToAutoloadMapPass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToAutoloadMapPass.php index 726e40b4af0e..683c5eb6cc89 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToAutoloadMapPass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToAutoloadMapPass.php @@ -28,10 +28,7 @@ class AddClassesToAutoloadMapPass implements CompilerPassInterface public function process(ContainerBuilder $container) { $classes = array(); - foreach ($container->getExtensionConfigs() as $name => $configs) { - list($namespace, $tag) = explode(':', $name); - - $extension = $container->getExtension($namespace); + foreach ($container->getExtensions() as $extension) { if ($extension instanceof Extension) { $classes = array_merge($classes, $extension->getAutoloadClassMap()); } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToCachePass.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToCachePass.php index f45c5d1667b1..c3282022d5fb 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToCachePass.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/AddClassesToCachePass.php @@ -28,10 +28,7 @@ class AddClassesToCachePass implements CompilerPassInterface public function process(ContainerBuilder $container) { $classes = array(); - foreach ($container->getExtensionConfigs() as $name => $configs) { - list($namespace, $tag) = explode(':', $name); - - $extension = $container->getExtension($namespace); + foreach ($container->getExtensions() as $extension) { if ($extension instanceof Extension) { $classes = array_merge($classes, $extension->getClassesToCompile()); } diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index eb2748bc41c0..73864ed9a62f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -30,6 +30,13 @@ */ class FrameworkExtension extends Extension { + public function load(array $configs, ContainerBuilder $container) + { + foreach ($configs as $config) { + $this->doConfigLoad($config, $container); + } + } + /** * Responds to the app.config configuration parameter. * diff --git a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php index 39f1608fdd0e..d3e39d25527e 100644 --- a/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php +++ b/src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php @@ -45,7 +45,19 @@ public function __construct() $this->configuration = new Configuration(); } - public function configLoad(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container) + { + foreach ($configs as $config) { + if (isset($config['acl'])) { + $this->doAclLoad($this->normalizeKeys($config['acl']), $container); + unset($config['acl']); + } + + $this->doConfigLoad($this->normalizeKeys($config), $container); + } + } + + public function doConfigLoad(array $configs, ContainerBuilder $container) { $processor = new Processor(); @@ -78,7 +90,7 @@ public function configLoad(array $configs, ContainerBuilder $container) } } - public function aclLoad(array $configs, ContainerBuilder $container) + public function doAclLoad(array $configs, ContainerBuilder $container) { $processor = new Processor(); $config = $processor->process($this->configuration->getAclConfigTree(), $configs); diff --git a/src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php b/src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php index 8948161ed9c4..7c7b32bed5a1 100644 --- a/src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php +++ b/src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php @@ -24,7 +24,7 @@ */ class SwiftMailerExtension extends Extension { - public function configLoad(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container) { foreach ($configs as $config) { $this->doConfigLoad($config, $container); diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php index 93d571e7e931..29bb03e0e504 100644 --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php @@ -24,7 +24,7 @@ */ class TwigExtension extends Extension { - public function configLoad(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('twig.xml'); diff --git a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php index bc31ce7049c8..519b16172279 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php +++ b/src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php @@ -33,7 +33,7 @@ */ class WebProfilerExtension extends Extension { - public function configLoad(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container) { foreach ($configs as $config) { $this->doConfigLoad($config, $container); diff --git a/src/Symfony/Bundle/ZendBundle/DependencyInjection/ZendExtension.php b/src/Symfony/Bundle/ZendBundle/DependencyInjection/ZendExtension.php index ac3c57957948..d893f6148500 100644 --- a/src/Symfony/Bundle/ZendBundle/DependencyInjection/ZendExtension.php +++ b/src/Symfony/Bundle/ZendBundle/DependencyInjection/ZendExtension.php @@ -35,7 +35,7 @@ class ZendExtension extends Extension * @param array $config An array of configuration settings * @param ContainerBuilder $container A ContainerBuilder instance */ - public function configLoad(array $configs, ContainerBuilder $container) + public function load(array $configs, ContainerBuilder $container) { $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('logger.xml'); diff --git a/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php b/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php index 0cdef1f6ecc4..dc6205a8f035 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php @@ -29,17 +29,17 @@ public function process(ContainerBuilder $container) $definitions = $container->getDefinitions(); $aliases = $container->getAliases(); - foreach ($container->getExtensionConfigs() as $name => $configs) { - list($namespace, $tag) = explode(':', $name); + foreach ($container->getExtensions() as $alias => $extension) { - $extension = $container->getExtension($namespace); + $configs = $container->getExtensionConfig($alias); + if ($configs !== false) { + $tmpContainer = new ContainerBuilder($container->getParameterBag()); + $tmpContainer->addObjectResource($extension); - $tmpContainer = new ContainerBuilder($container->getParameterBag()); - $tmpContainer->addObjectResource($extension); + $extension->load($configs, $tmpContainer); - $extension->load($tag, $configs, $tmpContainer); - - $container->merge($tmpContainer); + $container->merge($tmpContainer); + } } $container->addDefinitions($definitions); diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index 4f2ba5ca685e..3666ef839bd3 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php +++ b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -28,6 +28,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface { static protected $extensions = array(); + static protected $extensionsByNs = array(); protected $definitions = array(); protected $aliases = array(); @@ -57,7 +58,7 @@ static public function registerExtension(ExtensionInterface $extension) static::$extensions[$extension->getAlias()] = $extension; if (false !== $extension->getNamespace()) { - static::$extensions[$extension->getNamespace()] = $extension; + static::$extensionsByNs[$extension->getNamespace()] = $extension; } } @@ -70,13 +71,27 @@ static public function registerExtension(ExtensionInterface $extension) */ static public function getExtension($name) { - if (!isset(static::$extensions[$name])) { - throw new \LogicException(sprintf('Container extension "%s" is not registered', $name)); + if (empty(static::$extensions[$name])) { + if (empty(static::$extensionsByNs[$name])) { + throw new \LogicException(sprintf('Container extension "%s" is not registered', $name)); + } + + return static::$extensionsByNs[$name]; } return static::$extensions[$name]; } + /** + * Returns extensions keyed by alias + * + * @return array ExtensionInterfaces + */ + static public function getExtensions() + { + return static::$extensions; + } + /** * Checks if we have an extension. * @@ -85,7 +100,7 @@ static public function getExtension($name) */ static public function hasExtension($name) { - return isset(static::$extensions[$name]); + return isset(static::$extensions[$name]) || isset(static::$extensionsByNs[$name]); } /** @@ -129,12 +144,11 @@ public function addObjectResource($object) * Loads the configuration for an extension. * * @param string $extension The extension alias or namespace - * @param string $tag The extension tag to load (without the namespace - namespace.tag) * @param array $values An array of values that customizes the extension * * @return ContainerBuilder The current instance */ - public function loadFromExtension($extension, $tag, array $values = array()) + public function loadFromExtension($extension, array $values = array()) { if (true === $this->isFrozen()) { throw new \LogicException('Cannot load from an extension on a frozen container.'); @@ -142,11 +156,11 @@ public function loadFromExtension($extension, $tag, array $values = array()) $namespace = $this->getExtension($extension)->getAlias(); - if (!isset($this->extensionConfigs[$namespace.':'.$tag])) { - $this->extensionConfigs[$namespace.':'.$tag] = array(); + if (!isset($this->extensionConfigs[$namespace])) { + $this->extensionConfigs[$namespace] = array(); } - $this->extensionConfigs[$namespace.':'.$tag][] = $this->getParameterBag()->resolveValue($values); + $this->extensionConfigs[$namespace][] = $this->getParameterBag()->resolveValue($values); return $this; } @@ -365,6 +379,20 @@ public function getExtensionConfigs() return $this->extensionConfigs; } + /** + * Returns the containers for the registered extensions by alias. + * + * @return ExtensionInterface extension container + */ + public function getExtensionConfig($name) + { + if (empty($this->extensionConfigs[$name])) { + return array(array()); + } + + return $this->extensionConfigs[$name]; + } + /** * Sets the extension configs array * diff --git a/src/Symfony/Component/DependencyInjection/Extension/Extension.php b/src/Symfony/Component/DependencyInjection/Extension/Extension.php index bf56be455f1f..0380c252fac4 100644 --- a/src/Symfony/Component/DependencyInjection/Extension/Extension.php +++ b/src/Symfony/Component/DependencyInjection/Extension/Extension.php @@ -20,24 +20,6 @@ */ abstract class Extension implements ExtensionInterface { - /** - * Loads a specific configuration. - * - * @param string $tag The tag name - * @param array $config An array of configuration values - * @param ContainerBuilder $configuration A ContainerBuilder instance - * - * @throws \InvalidArgumentException When provided tag is not defined in this extension - */ - public function load($tag, array $config, ContainerBuilder $configuration) - { - if (!method_exists($this, $method = $tag.'Load')) { - throw new \InvalidArgumentException(sprintf('The tag "%s:%s" is not defined in the "%s" extension.', $this->getAlias(), $tag, $this->getAlias())); - } - - $this->$method($config, $configuration); - } - /** * This method normalizes keys between the different configuration formats * diff --git a/src/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php b/src/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php index c0df405f4507..58befbc08720 100644 --- a/src/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php +++ b/src/Symfony/Component/DependencyInjection/Extension/ExtensionInterface.php @@ -23,15 +23,12 @@ interface ExtensionInterface /** * Loads a specific configuration. * - * @param string $tag The tag name * @param array $config An array of configuration values * @param ContainerBuilder $configuration A ContainerBuilder instance * - * @return ContainerBuilder A ContainerBuilder instance - * * @throws \InvalidArgumentException When provided tag is not defined in this extension */ - function load($tag, array $config, ContainerBuilder $configuration); + function load(array $config, ContainerBuilder $configuration); /** * Returns the namespace to be used for this extension (XML namespace). diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index 6b6b3c3bfca6..c24f8ca92d3d 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -463,7 +463,7 @@ protected function loadFromExtensions(SimpleXMLElement $xml) $values = array(); } - $this->container->loadFromExtension($node->namespaceURI, $node->localName, $values); + $this->container->loadFromExtension($node->namespaceURI, $values); } } diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 9155feb0a4f0..79e1c5e660a6 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -280,22 +280,14 @@ protected function validate($content, $file) throw new \InvalidArgumentException(sprintf('The service file "%s" is not valid.', $file)); } - foreach (array_keys($content) as $key) { - if (in_array($key, array('imports', 'parameters', 'services', 'interfaces'))) { + foreach (array_keys($content) as $namespace) { + if (in_array($namespace, array('imports', 'parameters', 'services', 'interfaces'))) { continue; } - // can it be handled by an extension? - if (false !== strpos($key, '.')) { - list($namespace, $tag) = explode('.', $key); - if (!$this->container->hasExtension($namespace)) { - throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $key, $file)); - } - - continue; + if (!$this->container->hasExtension($namespace)) { + throw new \InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s).', $key, $file)); } - - throw new \InvalidArgumentException(sprintf('The "%s" tag is not valid (in %s).', $key, $file)); } return $content; @@ -341,18 +333,16 @@ protected function resolveServices($value) */ protected function loadFromExtensions($content) { - foreach ($content as $key => $values) { - if (in_array($key, array('imports', 'parameters', 'services', 'interfaces'))) { + foreach ($content as $namespace => $values) { + if (in_array($namespace, array('imports', 'parameters', 'services', 'interfaces'))) { continue; } - list($namespace, $tag) = explode('.', $key); - if (!is_array($values)) { $values = array(); } - $this->container->loadFromExtension($namespace, $tag, $values); + $this->container->loadFromExtension($namespace, $values); } } }