[Config] Introduction of an ConfigurationInterface

This commit is contained in:
Victor Berchet 2011-04-05 11:26:28 +02:00
parent e6e8d9b03d
commit b640fcb0f0
23 changed files with 243 additions and 125 deletions

View File

@ -99,11 +99,9 @@ class AsseticExtension extends Extension
*/ */
static protected function processConfigs(array $configs, $debug, array $bundles) static protected function processConfigs(array $configs, $debug, array $bundles)
{ {
$configuration = new Configuration();
$tree = $configuration->getConfigTree($debug, $bundles);
$processor = new Processor(); $processor = new Processor();
return $processor->process($tree, $configs); $configuration = new Configuration($debug, $bundles);
return $processor->processConfiguration($configuration, $configs);
} }
/** /**

View File

@ -12,6 +12,7 @@
namespace Symfony\Bundle\AsseticBundle\DependencyInjection; namespace Symfony\Bundle\AsseticBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* This class contains the configuration information for the bundle * This class contains the configuration information for the bundle
@ -22,24 +23,36 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
* @author Christophe Coevoet <stof@notk.org> * @author Christophe Coevoet <stof@notk.org>
* @author Kris Wallsmith <kris@symfony.com> * @author Kris Wallsmith <kris@symfony.com>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
private $bundles;
private $debug;
/** /**
* Generates the configuration tree. * Constructor
* *
* @param Boolean $debug Wether to use the debug mode * @param Boolean $debug Wether to use the debug mode
* @param array $bundles An array of bundle names * @param array $bundles An array of bundle names
*
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree
*/ */
public function getConfigTree($debug, array $bundles) public function __construct($debug, array $bundles)
{ {
$tree = new TreeBuilder(); $this->debug = (Boolean) $debug;
$this->bundles = $bundles;
}
$tree->root('assetic') /**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{
$builder = new TreeBuilder();
$builder->root('assetic')
->children() ->children()
->booleanNode('debug')->defaultValue($debug)->end() ->booleanNode('debug')->defaultValue($this->debug)->end()
->booleanNode('use_controller')->defaultValue($debug)->end() ->booleanNode('use_controller')->defaultValue($this->debug)->end()
->scalarNode('read_from')->defaultValue('%kernel.root_dir%/../web')->end() ->scalarNode('read_from')->defaultValue('%kernel.root_dir%/../web')->end()
->scalarNode('write_to')->defaultValue('%assetic.read_from%')->end() ->scalarNode('write_to')->defaultValue('%assetic.read_from%')->end()
->scalarNode('java')->defaultValue('/usr/bin/java')->end() ->scalarNode('java')->defaultValue('/usr/bin/java')->end()
@ -51,7 +64,7 @@ class Configuration
->fixXmlConfig('bundle') ->fixXmlConfig('bundle')
->children() ->children()
->arrayNode('bundles') ->arrayNode('bundles')
->defaultValue($bundles) ->defaultValue($this->bundles)
->requiresAtLeastOneElement() ->requiresAtLeastOneElement()
->beforeNormalization() ->beforeNormalization()
->ifTrue(function($v) { return !is_array($v); }) ->ifTrue(function($v) { return !is_array($v); })
@ -84,6 +97,6 @@ class Configuration
->end() ->end()
; ;
return $tree->buildTree(); return $builder;
} }
} }

View File

@ -13,6 +13,7 @@ namespace Symfony\Bundle\DoctrineBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* This class contains the configuration information for the bundle * This class contains the configuration information for the bundle
@ -22,28 +23,34 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
* *
* @author Christophe Coevoet <stof@notk.org> * @author Christophe Coevoet <stof@notk.org>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
private $kernelDebug; private $debug;
/** /**
* Generates the configuration tree. * Constructor
* *
* @param Boolean $kernelDebug * @param Boolean $debug Wether to use the debug mode
*
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree
*/ */
public function getConfigTree($kernelDebug) public function __construct($debug)
{
$this->debug = (Boolean) $debug;
}
/**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{ {
$this->kernelDebug = (bool) $kernelDebug;
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine'); $rootNode = $treeBuilder->root('doctrine');
$this->addDbalSection($rootNode); $this->addDbalSection($rootNode);
$this->addOrmSection($rootNode); $this->addOrmSection($rootNode);
return $treeBuilder->buildTree(); return $treeBuilder;
} }
private function addDbalSection(ArrayNodeDefinition $node) private function addDbalSection(ArrayNodeDefinition $node)
@ -98,7 +105,7 @@ class Configuration
->scalarNode('unix_socket')->end() ->scalarNode('unix_socket')->end()
->scalarNode('platform_service')->end() ->scalarNode('platform_service')->end()
->scalarNode('charset')->end() ->scalarNode('charset')->end()
->booleanNode('logging')->defaultValue($this->kernelDebug)->end() ->booleanNode('logging')->defaultValue($this->debug)->end()
->end() ->end()
->fixXmlConfig('driver_class', 'driverClass') ->fixXmlConfig('driver_class', 'driverClass')
->children() ->children()

View File

@ -31,9 +31,9 @@ class DoctrineExtension extends AbstractDoctrineExtension
{ {
public function load(array $configs, ContainerBuilder $container) public function load(array $configs, ContainerBuilder $container)
{ {
$configuration = new Configuration();
$processor = new Processor(); $processor = new Processor();
$config = $processor->process($configuration->getConfigTree($container->getParameter('kernel.debug')), $configs); $configuration = new Configuration($container->getParameter('kernel.debug'));
$config = $processor->processConfiguration($configuration, $configs);
if (!empty($config['dbal'])) { if (!empty($config['dbal'])) {
$this->dbalLoad($config['dbal'], $container); $this->dbalLoad($config['dbal'], $container);

View File

@ -3,20 +3,21 @@
namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection; namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* DoctrineMigrationsExtension configuration structure. * DoctrineMigrationsExtension configuration structure.
* *
* @author Lukas Kahwe Smith <smith@pooteeweet.org> * @author Lukas Kahwe Smith <smith@pooteeweet.org>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
/** /**
* Generates the configuration tree. * Generates the configuration tree builder.
* *
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/ */
public function getConfigTree() public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine_migrations', 'array'); $rootNode = $treeBuilder->root('doctrine_migrations', 'array');
@ -30,6 +31,6 @@ class Configuration
->end() ->end()
; ;
return $treeBuilder->buildTree(); return $treeBuilder;
} }
} }

View File

@ -11,9 +11,9 @@
namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection; namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\Definition\Processor;
/** /**
* DoctrineMigrationsExtension. * DoctrineMigrationsExtension.
@ -33,7 +33,7 @@ class DoctrineMigrationsExtension extends Extension
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(); $configuration = new Configuration();
$config = $processor->process($configuration->getConfigTree(), $configs); $config = $processor->processConfiguration($configuration, $configs);
foreach ($config as $key => $value) { foreach ($config as $key => $value) {
$container->setParameter($this->getAlias().'.'.$key, $value); $container->setParameter($this->getAlias().'.'.$key, $value);

View File

@ -4,13 +4,14 @@ namespace Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* FrameworkExtension configuration structure. * FrameworkExtension configuration structure.
* *
* @author Ryan Weaver <ryan@thatsquality.com> * @author Ryan Weaver <ryan@thatsquality.com>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
private $debug; private $debug;
@ -25,11 +26,11 @@ class Configuration
} }
/** /**
* Generates the configuration tree. * Generates the configuration tree builder.
* *
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/ */
public function getConfigTree() public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine_mongo_db'); $rootNode = $treeBuilder->root('doctrine_mongo_db');
@ -49,7 +50,7 @@ class Configuration
->end() ->end()
; ;
return $treeBuilder->buildTree(); return $treeBuilder;
} }
/** /**

View File

@ -17,8 +17,8 @@ use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\FileLocator;
use Symfony\Bundle\DoctrineAbstractBundle\DependencyInjection\AbstractDoctrineExtension;
use Symfony\Component\Config\Definition\Processor; use Symfony\Component\Config\Definition\Processor;
use Symfony\Bundle\DoctrineAbstractBundle\DependencyInjection\AbstractDoctrineExtension;
/** /**
* Doctrine MongoDB ODM extension. * Doctrine MongoDB ODM extension.
@ -40,7 +40,7 @@ class DoctrineMongoDBExtension extends AbstractDoctrineExtension
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration($container->getParameter('kernel.debug')); $configuration = new Configuration($container->getParameter('kernel.debug'));
$config = $processor->process($configuration->getConfigTree(), $configs); $config = $processor->processConfiguration($configuration, $configs);
// can't currently default this correctly in Configuration // can't currently default this correctly in Configuration
if (!isset($config['metadata_cache_driver'])) { if (!isset($config['metadata_cache_driver'])) {

View File

@ -14,7 +14,6 @@ namespace Symfony\Bundle\DoctrineMongoDBBundle\Tests\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection\Configuration; use Symfony\Bundle\DoctrineMongoDBBundle\DependencyInjection\Configuration;
use Symfony\Component\Yaml\Yaml; use Symfony\Component\Yaml\Yaml;
use Symfony\Component\Config\Definition\Processor; use Symfony\Component\Config\Definition\Processor;
class ConfigurationTest extends \PHPUnit_Framework_TestCase class ConfigurationTest extends \PHPUnit_Framework_TestCase
@ -23,7 +22,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
{ {
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(false); $configuration = new Configuration(false);
$options = $processor->process($configuration->getConfigTree(), array()); $options = $processor->processConfiguration($configuration, array());
$defaults = array( $defaults = array(
'auto_generate_hydrator_classes' => false, 'auto_generate_hydrator_classes' => false,
@ -56,7 +55,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
{ {
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(false); $configuration = new Configuration(false);
$options = $processor->process($configuration->getConfigTree(), array($config)); $options = $processor->processConfiguration($configuration, array($config));
$expected = array( $expected = array(
'proxy_namespace' => 'Test_Proxies', 'proxy_namespace' => 'Test_Proxies',
@ -141,7 +140,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
{ {
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(false); $configuration = new Configuration(false);
$options = $processor->process($configuration->getConfigTree(), $configs); $options = $processor->processConfiguration($configuration, $configs);
foreach ($correctValues as $key => $correctVal) foreach ($correctValues as $key => $correctVal)
{ {
@ -230,7 +229,7 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
{ {
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(false); $configuration = new Configuration(false);
$options = $processor->process($configuration->getConfigTree(), array($config)); $options = $processor->processConfiguration($configuration, array($config));
$this->assertSame($normalized, $options[$targetKey]); $this->assertSame($normalized, $options[$targetKey]);
} }

View File

@ -4,29 +4,40 @@ namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* FrameworkExtension configuration structure. * FrameworkExtension configuration structure.
* *
* @author Jeremy Mikola <jmikola@gmail.com> * @author Jeremy Mikola <jmikola@gmail.com>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
private $debug;
/** /**
* Generates the configuration tree. * Constructor
* *
* @param boolean $kernelDebug The kernel.debug DIC parameter * @param Boolean $debug Wether to use the debug mode
*
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree
*/ */
public function getConfigTree($kernelDebug) public function __construct($debug)
{
$this->debug = (Boolean) $debug;
}
/**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('framework'); $rootNode = $treeBuilder->root('framework');
$rootNode $rootNode
->children() ->children()
->scalarNode('cache_warmer')->defaultValue(!$kernelDebug)->end() ->scalarNode('cache_warmer')->defaultValue(!$this->debug)->end()
->scalarNode('charset')->end() ->scalarNode('charset')->end()
->scalarNode('document_root')->end() ->scalarNode('document_root')->end()
->scalarNode('error_handler')->end() ->scalarNode('error_handler')->end()
@ -45,7 +56,7 @@ class Configuration
$this->addTranslatorSection($rootNode); $this->addTranslatorSection($rootNode);
$this->addValidationSection($rootNode); $this->addValidationSection($rootNode);
return $treeBuilder->buildTree(); return $treeBuilder;
} }
private function addCsrfProtectionSection(ArrayNodeDefinition $rootNode) private function addCsrfProtectionSection(ArrayNodeDefinition $rootNode)

View File

@ -15,12 +15,12 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Parameter; use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Finder\Finder; use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Definition\Processor;
/** /**
* FrameworkExtension. * FrameworkExtension.
@ -56,9 +56,8 @@ class FrameworkExtension extends Extension
} }
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(); $configuration = new Configuration($container->getParameter('kernel.debug'));
$config = $processor->processConfiguration($configuration, $configs);
$config = $processor->process($configuration->getConfigTree($container->getParameter('kernel.debug')), $configs);
$container->setParameter('kernel.cache_warmup', $config['cache_warmer']); $container->setParameter('kernel.cache_warmup', $config['cache_warmer']);

View File

@ -0,0 +1,45 @@
<?php
namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/**
* This class contains the configuration information for the following tags:
*
* * security.config
* * security.acl
*
* This information is solely responsible for how the different configuration
* sections are normalized, and merged.
*
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
*/
class FactoryConfiguration implements ConfigurationInterface
{
/**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{
$tb = new TreeBuilder();
$tb
->root('security')
->ignoreExtraKeys()
->fixXmlConfig('factory', 'factories')
->children()
->arrayNode('factories')
->prototype('scalar')->end()
->end()
->end()
->end()
;
return $tb;
}
}

View File

@ -4,6 +4,7 @@ namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* This class contains the configuration information for the following tags: * This class contains the configuration information for the following tags:
@ -16,31 +17,26 @@ use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
* *
* @author Johannes M. Schmitt <schmittjoh@gmail.com> * @author Johannes M. Schmitt <schmittjoh@gmail.com>
*/ */
class Configuration class MainConfiguration implements ConfigurationInterface
{ {
/** private $factories;
* Generates the configuration tree.
*
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree
*/
public function getFactoryConfigTree()
{
$tb = new TreeBuilder();
return $tb /**
->root('security') * Constructor.
->ignoreExtraKeys() *
->fixXmlConfig('factory', 'factories') * @param array $factories
->children() */
->arrayNode('factories') public function __construct(array $factories)
->prototype('scalar')->end() {
->end() $this->factories = $factories;
->end()
->end()
->buildTree();
} }
public function getMainConfigTree(array $factories) /**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{ {
$tb = new TreeBuilder(); $tb = new TreeBuilder();
$rootNode = $tb->root('security'); $rootNode = $tb->root('security');
@ -69,11 +65,11 @@ class Configuration
$this->addAclSection($rootNode); $this->addAclSection($rootNode);
$this->addEncodersSection($rootNode); $this->addEncodersSection($rootNode);
$this->addProvidersSection($rootNode); $this->addProvidersSection($rootNode);
$this->addFirewallsSection($rootNode, $factories); $this->addFirewallsSection($rootNode, $this->factories);
$this->addAccessControlSection($rootNode); $this->addAccessControlSection($rootNode);
$this->addRoleHierarchySection($rootNode); $this->addRoleHierarchySection($rootNode);
return $tb->buildTree(); return $tb;
} }
private function addAclSection(ArrayNodeDefinition $rootNode) private function addAclSection(ArrayNodeDefinition $rootNode)

View File

@ -11,7 +11,6 @@
namespace Symfony\Bundle\SecurityBundle\DependencyInjection; namespace Symfony\Bundle\SecurityBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Processor;
use Symfony\Component\DependencyInjection\DefinitionDecorator; use Symfony\Component\DependencyInjection\DefinitionDecorator;
use Symfony\Component\DependencyInjection\Alias; use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\HttpKernel\DependencyInjection\Extension; use Symfony\Component\HttpKernel\DependencyInjection\Extension;
@ -20,6 +19,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Parameter; use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Definition\Processor;
/** /**
* SecurityExtension. * SecurityExtension.
@ -32,14 +32,8 @@ class SecurityExtension extends Extension
private $requestMatchers = array(); private $requestMatchers = array();
private $contextListeners = array(); private $contextListeners = array();
private $listenerPositions = array('pre_auth', 'form', 'http', 'remember_me'); private $listenerPositions = array('pre_auth', 'form', 'http', 'remember_me');
private $configuration;
private $factories; private $factories;
public function __construct()
{
$this->configuration = new Configuration();
}
public function load(array $configs, ContainerBuilder $container) public function load(array $configs, ContainerBuilder $container)
{ {
if (!array_filter($configs)) { if (!array_filter($configs)) {
@ -49,11 +43,13 @@ class SecurityExtension extends Extension
$processor = new Processor(); $processor = new Processor();
// first assemble the factories // first assemble the factories
$factories = $this->createListenerFactories($container, $processor->process($this->configuration->getFactoryConfigTree(), $configs)); $factoriesConfig = new FactoryConfiguration();
$config = $processor->processConfiguration($factoriesConfig, $configs);
$factories = $this->createListenerFactories($container, $config);
// normalize and merge the actual configuration // normalize and merge the actual configuration
$tree = $this->configuration->getMainConfigTree($factories); $mainConfig = new MainConfiguration($factories);
$config = $processor->process($tree, $configs); $config = $processor->processConfiguration($mainConfig, $configs);
// load services // load services
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));

View File

@ -11,7 +11,7 @@
namespace Symfony\Bundle\SecurityBundle\Tests\DependencyInjection; namespace Symfony\Bundle\SecurityBundle\Tests\DependencyInjection;
use Symfony\Bundle\SecurityBundle\DependencyInjection\Configuration; use Symfony\Bundle\SecurityBundle\DependencyInjection\MainConfiguration;
use Symfony\Component\Config\Definition\Processor; use Symfony\Component\Config\Definition\Processor;
class ConfigurationTest extends \PHPUnit_Framework_TestCase class ConfigurationTest extends \PHPUnit_Framework_TestCase
@ -41,11 +41,10 @@ class ConfigurationTest extends \PHPUnit_Framework_TestCase
'factory' => array('foo' => 'bar'), 'factory' => array('foo' => 'bar'),
'factories' => array('lorem' => 'ipsum'), 'factories' => array('lorem' => 'ipsum'),
)); ));
$configuration = new Configuration();
$processor = new Processor(); $processor = new Processor();
$tree = $configuration->getMainConfigTree(array()); $configuration = new MainConfiguration(array());
$config = $processor->process($tree, array($config)); $config = $processor->processConfiguration($configuration, array($config));
$this->assertFalse(array_key_exists('factory', $config), 'The factory key is silently removed without an exception'); $this->assertFalse(array_key_exists('factory', $config), 'The factory key is silently removed without an exception');
$this->assertEquals(array(), $config['factories'], 'The factories key is just an empty array'); $this->assertEquals(array(), $config['factories'], 'The factories key is just an empty array');

View File

@ -13,6 +13,7 @@ namespace Symfony\Bundle\SwiftmailerBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* This class contains the configuration information for the bundle * This class contains the configuration information for the bundle
@ -22,16 +23,26 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
* *
* @author Christophe Coevoet <stof@notk.org> * @author Christophe Coevoet <stof@notk.org>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
private $debug;
/** /**
* Generates the configuration tree. * Constructor.
* *
* @param Boolean $kernelDebug * @param Boolean $debug The kernel.debug value
*
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree
*/ */
public function getConfigTree($kernelDebug) public function __construct($debug)
{
$this->debug = (Boolean) $debug;
}
/**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('swiftmailer'); $rootNode = $treeBuilder->root('swiftmailer');
@ -71,10 +82,10 @@ class Configuration
->end() ->end()
->scalarNode('delivery_address')->end() ->scalarNode('delivery_address')->end()
->booleanNode('disable_delivery')->end() ->booleanNode('disable_delivery')->end()
->booleanNode('logging')->defaultValue($kernelDebug)->end() ->booleanNode('logging')->defaultValue($this->debug)->end()
->end() ->end()
; ;
return $treeBuilder->buildTree(); return $treeBuilder;
} }
} }

View File

@ -48,9 +48,9 @@ class SwiftmailerExtension extends Extension
$r = new \ReflectionClass('Swift_Message'); $r = new \ReflectionClass('Swift_Message');
$container->getDefinition('swiftmailer.mailer')->setFile(dirname(dirname(dirname($r->getFilename()))).'/swift_init.php'); $container->getDefinition('swiftmailer.mailer')->setFile(dirname(dirname(dirname($r->getFilename()))).'/swift_init.php');
$configuration = new Configuration();
$processor = new Processor(); $processor = new Processor();
$config = $processor->process($configuration->getConfigTree($container->getParameter('kernel.debug')), $configs); $configuration = new Configuration($container->getParameter('kernel.debug'));
$config = $processor->processConfiguration($configuration, $configs);
if (null === $config['transport']) { if (null === $config['transport']) {
$transport = 'null'; $transport = 'null';

View File

@ -4,20 +4,21 @@ namespace Symfony\Bundle\TwigBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* TwigExtension configuration structure. * TwigExtension configuration structure.
* *
* @author Jeremy Mikola <jmikola@gmail.com> * @author Jeremy Mikola <jmikola@gmail.com>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
/** /**
* Generates the configuration tree. * Generates the configuration tree builder.
* *
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/ */
public function getConfigTree() public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('twig'); $rootNode = $treeBuilder->root('twig');
@ -33,7 +34,7 @@ class Configuration
$this->addGlobalsSection($rootNode); $this->addGlobalsSection($rootNode);
$this->addTwigOptions($rootNode); $this->addTwigOptions($rootNode);
return $treeBuilder->buildTree(); return $treeBuilder;
} }
private function addExtensionsSection(ArrayNodeDefinition $rootNode) private function addExtensionsSection(ArrayNodeDefinition $rootNode)

View File

@ -39,8 +39,7 @@ class TwigExtension extends Extension
$processor = new Processor(); $processor = new Processor();
$configuration = new Configuration(); $configuration = new Configuration();
$config = $processor->processConfiguration($configuration, $configs);
$config = $processor->process($configuration->getConfigTree(), $configs);
$container->setParameter('twig.form.resources', $config['form']['resources']); $container->setParameter('twig.form.resources', $config['form']['resources']);

View File

@ -12,6 +12,7 @@
namespace Symfony\Bundle\WebProfilerBundle\DependencyInjection; namespace Symfony\Bundle\WebProfilerBundle\DependencyInjection;
use Symfony\Component\Config\Definition\Builder\TreeBuilder; use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
/** /**
* This class contains the configuration information for the bundle * This class contains the configuration information for the bundle
@ -21,14 +22,14 @@ use Symfony\Component\Config\Definition\Builder\TreeBuilder;
* *
* @author Fabien Potencier <fabien@symfony.com> * @author Fabien Potencier <fabien@symfony.com>
*/ */
class Configuration class Configuration implements ConfigurationInterface
{ {
/** /**
* Generates the configuration tree. * Generates the configuration tree builder.
* *
* @return \Symfony\Component\Config\Definition\ArrayNode The config tree * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/ */
public function getConfigTree() public function getConfigTreeBuilder()
{ {
$treeBuilder = new TreeBuilder(); $treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('web_profiler'); $rootNode = $treeBuilder->root('web_profiler');
@ -41,6 +42,6 @@ class Configuration
->end() ->end()
; ;
return $treeBuilder->buildTree(); return $treeBuilder;
} }
} }

View File

@ -39,9 +39,9 @@ class WebProfilerExtension extends Extension
*/ */
public function load(array $configs, ContainerBuilder $container) public function load(array $configs, ContainerBuilder $container)
{ {
$configuration = new Configuration();
$processor = new Processor(); $processor = new Processor();
$config = $processor->process($configuration->getConfigTree(), $configs); $configuration = new Configuration();
$config = $processor->processConfiguration($configuration, $configs);
if ($config['toolbar']) { if ($config['toolbar']) {
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));

View File

@ -0,0 +1,27 @@
<?php
/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien@symfony.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Component\Config\Definition;
/**
* Configuration interface
*
* @author Victor Berchet <victor@suumit.com>
*/
interface ConfigurationInterface
{
/**
* Generates the configuration tree builder.
*
* @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
*/
function getConfigTreeBuilder();
}

View File

@ -19,11 +19,12 @@ namespace Symfony\Component\Config\Definition;
class Processor class Processor
{ {
/** /**
* Processes a node tree. * Processes an array of configurations.
* *
* @param NodeInterface $configTree The node tree to process * @param NodeInterface $configTree The node tree describing the configuration
* @param array $configs An array of configuration items * @param array $configs An array of configuration items to process
* @return Boolean *
* @return array The processed configuration
*/ */
public function process(NodeInterface $configTree, array $configs) public function process(NodeInterface $configTree, array $configs)
{ {
@ -38,6 +39,19 @@ class Processor
return $configTree->finalize($currentConfig); return $configTree->finalize($currentConfig);
} }
/**
* Processes an array of configurations.
*
* @param ConfigurationInterface $configuration The configuration class
* @param array $configs An array of configuration items to process
*
* @return array The processed configuration
*/
public function processConfiguration(ConfigurationInterface $configuration, array $configs)
{
return $this->process($configuration->getConfigTreeBuilder()->buildTree(), $configs);
}
/** /**
* This method normalizes keys between the different configuration formats * This method normalizes keys between the different configuration formats
* *