Bladeren bron

implicitly load all registered bundles, all loading is now handled by load(), disable loading of an extension explcitly via setting the extension config to false (for now only Yaml is implemented)

Lukas Kahwe Smith 14 jaren geleden
bovenliggende
commit
7f182bd877

+ 24 - 2
src/Symfony/Bundle/DoctrineBundle/DependencyInjection/DoctrineExtension.php

@@ -30,6 +30,28 @@ use Symfony\Component\Config\FileLocator;
  */
 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 @@ class DoctrineExtension extends AbstractDoctrineExtension
      * @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');

+ 1 - 4
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());
             }

+ 1 - 4
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());
             }

+ 7 - 0
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

@@ -30,6 +30,13 @@ use Symfony\Component\Config\FileLocator;
  */
 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.
      *

+ 14 - 2
src/Symfony/Bundle/SecurityBundle/DependencyInjection/SecurityExtension.php

@@ -45,7 +45,19 @@ class SecurityExtension extends Extension
         $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 @@ class SecurityExtension extends Extension
         }
     }
 
-    public function aclLoad(array $configs, ContainerBuilder $container)
+    public function doAclLoad(array $configs, ContainerBuilder $container)
     {
         $processor = new Processor();
         $config = $processor->process($this->configuration->getAclConfigTree(), $configs);

+ 1 - 1
src/Symfony/Bundle/SwiftmailerBundle/DependencyInjection/SwiftmailerExtension.php

@@ -24,7 +24,7 @@ use Symfony\Component\Config\FileLocator;
  */
 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);

+ 1 - 1
src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php

@@ -24,7 +24,7 @@ use Symfony\Component\Config\FileLocator;
  */
 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');

+ 1 - 1
src/Symfony/Bundle/WebProfilerBundle/DependencyInjection/WebProfilerExtension.php

@@ -33,7 +33,7 @@ use Symfony\Component\Config\FileLocator;
  */
 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);

+ 1 - 1
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');

+ 8 - 8
src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php

@@ -29,17 +29,17 @@ class MergeExtensionConfigurationPass implements CompilerPassInterface
         $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);

+ 37 - 9
src/Symfony/Component/DependencyInjection/ContainerBuilder.php

@@ -28,6 +28,7 @@ use Symfony\Component\Config\Resource\ResourceInterface;
 class ContainerBuilder extends Container implements TaggedContainerInterface
 {
     static protected $extensions = array();
+    static protected $extensionsByNs = array();
 
     protected $definitions      = array();
     protected $aliases          = array();
@@ -57,7 +58,7 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
         static::$extensions[$extension->getAlias()] = $extension;
 
         if (false !== $extension->getNamespace()) {
-            static::$extensions[$extension->getNamespace()] = $extension;
+            static::$extensionsByNs[$extension->getNamespace()] = $extension;
         }
     }
 
@@ -70,13 +71,27 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      */
     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 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      */
     static public function hasExtension($name)
     {
-        return isset(static::$extensions[$name]);
+        return isset(static::$extensions[$name]) || isset(static::$extensionsByNs[$name]);
     }
 
     /**
@@ -129,12 +144,11 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
      * 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 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
 
         $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 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
         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
      *

+ 0 - 18
src/Symfony/Component/DependencyInjection/Extension/Extension.php

@@ -20,24 +20,6 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
  */
 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
      *

+ 1 - 4
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).

+ 1 - 1
src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php

@@ -463,7 +463,7 @@ EOF
                 $values = array();
             }
 
-            $this->container->loadFromExtension($node->namespaceURI, $node->localName, $values);
+            $this->container->loadFromExtension($node->namespaceURI, $values);
         }
     }
 

+ 7 - 17
src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

@@ -280,22 +280,14 @@ class YamlFileLoader extends FileLoader
             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 @@ class YamlFileLoader extends FileLoader
      */
     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);
         }
     }
 }