Skip to content

Commit

Permalink
[Config] Component refactoring
Browse files Browse the repository at this point in the history
The Config component API have changed and the extension configuration files must be updated accordingly:

1. Array nodes must enclosed their children definition in ->children() ... ->end() calls:

Before:

    $treeBuilder->root('zend', 'array')
        ->arrayNode('logger')
            ->scalarNode('priority')->defaultValue('INFO')->end()
            ->booleanNode('log_errors')->defaultFalse()->end()
        ->end();

After:

    $treeBuilder->root('zend', 'array')
        ->children()
            ->arrayNode('logger')
                ->children()
                    ->scalarNode('priority')->defaultValue('INFO')->end()
                    ->booleanNode('log_errors')->defaultFalse()->end()
                ->end()
            ->end()
        ->end();

2. The 'builder' method (in NodeBuilder) has been dropped in favor of an 'append' method (in ArrayNodeDefinition)

Before:

    $treeBuilder->root('doctrine', 'array')
        ->arrayNode('dbal')
            ->builder($this->getDbalConnectionsNode())
        ->end();

After:

    $treeBuilder->root('doctrine', 'array')
        ->children()
            ->arrayNode('dbal')
                ->append($this->getDbalConnectionsNode())
            ->end()
        ->end();

3. The root of a TreeBuilder is now an NodeDefinition (and most probably an ArrayNodeDefinition):

Before:

    $root = $treeBuilder->root('doctrine', 'array');
    $this->addDbalSection($root);

    public function addDbalSection(NodeBuilder $node)
    {
        ...
    }

After:

    $root = $treeBuilder->root('doctrine', 'array');
    $this->addDbalSection($root);

    public function addDbalSection(ArrayNodeDefinition $node)
    {
        ...
    }

4. The NodeBuilder API has changed (this is seldom used):

Before:

    $node = new NodeBuilder('connections', 'array');

After:

The recommended way is to use a tree builder:

    $treeBuilder = new TreeBuilder();
    $node = $treeBuilder->root('connections', 'array');

An other way would be:

    $builder = new NodeBuilder();
    $node = $builder->node('connections', 'array');

Some notes:

- Tree root nodes should most always be array nodes, so this as been made the default:

    $treeBuilder->root('doctrine', 'array') is equivalent to $treeBuilder->root('doctrine')

- There could be more than one ->children() ... ->end() sections. This could help with the readability:

    $treeBuilder->root('doctrine')
        ->children()
            ->scalarNode('default_connection')->end()
        ->end()
        ->fixXmlConfig('type')
        ->children()
            ->arrayNode('types')
                ....
            ->end()
        ->end()
  • Loading branch information
vicb committed Mar 17, 2011
1 parent 60c1159 commit 1e0ed22
Show file tree
Hide file tree
Showing 48 changed files with 2,271 additions and 1,580 deletions.
Expand Up @@ -26,35 +26,44 @@ class Configuration
/**
* Generates the configuration tree.
*
* @return Symfony\Component\Config\Definition\NodeInterface The config tree
* @param Boolean $debug Wether to use the debug mode
* @param array $bundles An array of bundle names
*
* @return NodeInterface The config tree
*/
public function getConfigTree($debug, $bundles)
public function getConfigTree($debug, array $bundles)
{
$tree = new TreeBuilder();
$tree->root('assetic', 'array')
->booleanNode('debug')->defaultValue($debug)->end()
->booleanNode('use_controller')->defaultValue($debug)->end()
->scalarNode('read_from')->defaultValue('%kernel.root_dir%/../web')->end()
->scalarNode('write_to')->defaultValue('%assetic.read_from%')->end()
->scalarNode('closure')->end()
->scalarNode('yui')->end()
->scalarNode('default_javascripts_output')->defaultValue('js/*.js')->end()
->scalarNode('default_stylesheets_output')->defaultValue('css/*.css')->end()

$tree->root('assetic')
->children()
->booleanNode('debug')->defaultValue($debug)->end()
->booleanNode('use_controller')->defaultValue($debug)->end()
->scalarNode('read_from')->defaultValue('%kernel.root_dir%/../web')->end()
->scalarNode('write_to')->defaultValue('%assetic.read_from%')->end()
->scalarNode('closure')->end()
->scalarNode('yui')->end()
->scalarNode('default_javascripts_output')->defaultValue('js/*.js')->end()
->scalarNode('default_stylesheets_output')->defaultValue('css/*.css')->end()
->end()
->fixXmlConfig('bundle')
->arrayNode('bundles')
->defaultValue($bundles)
->requiresAtLeastOneElement()
->beforeNormalization()
->ifTrue(function($v){ return !is_array($v); })
->then(function($v){ return array($v); })
->end()
->prototype('scalar')
->children()
->arrayNode('bundles')
->defaultValue($bundles)
->requiresAtLeastOneElement()
->beforeNormalization()
->ifTrue(function($v) { return is_array($v) && isset($v['name']); })
->then(function($v){ return $v['name']; })
->ifTrue(function($v){ return !is_array($v); })
->then(function($v){ return array($v); })
->end()
->prototype('scalar')
->beforeNormalization()
->ifTrue(function($v) { return is_array($v) && isset($v['name']); })
->then(function($v){ return $v['name']; })
->end()
->end()
->end()
->end();
->end()
;

return $tree->buildTree();
}
Expand Down
Expand Up @@ -11,7 +11,7 @@

namespace Symfony\Bundle\DoctrineBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\NodeBuilder;
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;

/**
Expand All @@ -37,118 +37,145 @@ public function getConfigTree($kernelDebug)
$this->kernelDebug = (bool) $kernelDebug;

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine', 'array');
$rootNode = $treeBuilder->root('doctrine');

$this->addDbalSection($rootNode);
$this->addOrmSection($rootNode);

return $treeBuilder->buildTree();
}

private function addDbalSection(NodeBuilder $node)
private function addDbalSection(ArrayNodeDefinition $node)
{
$node
->children()
->arrayNode('dbal')
->beforeNormalization()
->ifNull()
// Define a default connection using the default values
->then(function($v) { return array ('connections' => array('default' => array())); })
->end()
->scalarNode('default_connection')->end()
->children()
->scalarNode('default_connection')->end()
->end()
->fixXmlConfig('type')
->arrayNode('types')
->useAttributeAsKey('name')
->prototype('scalar')
->beforeNormalization()
->ifTrue(function($v) { return is_array($v) && isset($v['class']); })
->then(function($v) { return $v['class']; })
->children()
->arrayNode('types')
->useAttributeAsKey('name')
->prototype('scalar')
->beforeNormalization()
->ifTrue(function($v) { return is_array($v) && isset($v['class']); })
->then(function($v) { return $v['class']; })
->end()
->end()
->end()
->end()
->fixXmlConfig('connection')
->builder($this->getDbalConnectionsNode())
->append($this->getDbalConnectionsNode())
->end()
;
}

private function getDbalConnectionsNode()
{
$node = new NodeBuilder('connections', 'array');
$treeBuilder = new TreeBuilder();
$node = $treeBuilder->root('connections');

$node
->requiresAtLeastOneElement()
->useAttributeAsKey('name')
->prototype('array')
->scalarNode('dbname')->end()
->scalarNode('host')->defaultValue('localhost')->end()
->scalarNode('port')->defaultNull()->end()
->scalarNode('user')->defaultValue('root')->end()
->scalarNode('password')->defaultNull()->end()
->scalarNode('driver')->defaultValue('pdo_mysql')->end()
->children()
->scalarNode('dbname')->end()
->scalarNode('host')->defaultValue('localhost')->end()
->scalarNode('port')->defaultNull()->end()
->scalarNode('user')->defaultValue('root')->end()
->scalarNode('password')->defaultNull()->end()
->scalarNode('driver')->defaultValue('pdo_mysql')->end()
->scalarNode('path')->end()
->booleanNode('memory')->end()
->scalarNode('unix_socket')->end()
->scalarNode('platform_service')->end()
->scalarNode('charset')->end()
->booleanNode('logging')->defaultValue($this->kernelDebug)->end()
->end()
->fixXmlConfig('driver_class', 'driverClass')
->scalarNode('driver_class')->end()
->children()
->scalarNode('driver_class')->end()
->end()
->fixXmlConfig('options', 'driverOptions')
->arrayNode('driverOptions')
->useAttributeAsKey('key')
->prototype('scalar')->end()
->children()
->arrayNode('driverOptions')
->useAttributeAsKey('key')
->prototype('scalar')->end()
->end()
->end()
->scalarNode('path')->end()
->booleanNode('memory')->end()
->scalarNode('unix_socket')->end()
->fixXmlConfig('wrapper_class', 'wrapperClass')
->scalarNode('wrapper_class')->end()
->scalarNode('platform_service')->end()
->scalarNode('charset')->end()
->booleanNode('logging')->defaultValue($this->kernelDebug)->end()
->children()
->scalarNode('wrapper_class')->end()
->end()
->end()
;

return $node;
}

private function addOrmSection(NodeBuilder $node)
private function addOrmSection(ArrayNodeDefinition $node)
{
$node
->arrayNode('orm')
->scalarNode('default_entity_manager')->end()
->booleanNode('auto_generate_proxy_classes')->defaultFalse()->end()
->scalarNode('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/orm/Proxies')->end()
->scalarNode('proxy_namespace')->defaultValue('Proxies')->end()
->fixXmlConfig('entity_manager')
->builder($this->getOrmEntityManagersNode())
->children()
->arrayNode('orm')
->children()
->scalarNode('default_entity_manager')->end()
->booleanNode('auto_generate_proxy_classes')->defaultFalse()->end()
->scalarNode('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/orm/Proxies')->end()
->scalarNode('proxy_namespace')->defaultValue('Proxies')->end()
->end()
->fixXmlConfig('entity_manager')
->append($this->getOrmEntityManagersNode())
->end()
->end()
;
}

private function getOrmEntityManagersNode()
{
$node = new NodeBuilder('entity_managers', 'array');
$treeBuilder = new TreeBuilder();
$node = $treeBuilder->root('entity_managers');

$node
->requiresAtLeastOneElement()
->useAttributeAsKey('name')
->prototype('array')
->addDefaultsIfNotSet()
->builder($this->getOrmCacheDriverNode('query_cache_driver'))
->builder($this->getOrmCacheDriverNode('metadata_cache_driver'))
->builder($this->getOrmCacheDriverNode('result_cache_driver'))
->scalarNode('connection')->end()
->scalarNode('class_metadata_factory_name')->defaultValue('%doctrine.orm.class_metadata_factory_name%')->end()
->append($this->getOrmCacheDriverNode('query_cache_driver'))
->append($this->getOrmCacheDriverNode('metadata_cache_driver'))
->append($this->getOrmCacheDriverNode('result_cache_driver'))
->children()
->scalarNode('connection')->end()
->scalarNode('class_metadata_factory_name')->defaultValue('%doctrine.orm.class_metadata_factory_name%')->end()
->end()
->fixXmlConfig('mapping')
->arrayNode('mappings')
->isRequired()
->requiresAtLeastOneElement()
->useAttributeAsKey('name')
->prototype('array')
->beforeNormalization()
->ifString()
->then(function($v) { return array ('type' => $v); })
->children()
->arrayNode('mappings')
->isRequired()
->requiresAtLeastOneElement()
->useAttributeAsKey('name')
->prototype('array')
->beforeNormalization()
->ifString()
->then(function($v) { return array ('type' => $v); })
->end()
->treatNullLike(array ())
->performNoDeepMerging()
->children()
->scalarNode('type')->end()
->scalarNode('dir')->end()
->scalarNode('alias')->end()
->scalarNode('prefix')->end()
->booleanNode('is_bundle')->end()
->end()
->end()
->treatNullLike(array ())
->scalarNode('type')->end()
->scalarNode('dir')->end()
->scalarNode('alias')->end()
->scalarNode('prefix')->end()
->booleanNode('is_bundle')->end()
->performNoDeepMerging()
->end()
->end()
->end()
Expand All @@ -159,18 +186,22 @@ private function getOrmEntityManagersNode()

private function getOrmCacheDriverNode($name)
{
$node = new NodeBuilder($name, 'array');
$treeBuilder = new TreeBuilder();
$node = $treeBuilder->root($name);

$node
->addDefaultsIfNotSet()
->beforeNormalization()
->ifString()
->then(function($v) { return array ('type' => $v); })
->end()
->scalarNode('type')->defaultValue('array')->isRequired()->end()
->scalarNode('host')->end()
->scalarNode('port')->end()
->scalarNode('instance_class')->end()
->scalarNode('class')->end()
->children()
->scalarNode('type')->defaultValue('array')->isRequired()->end()
->scalarNode('host')->end()
->scalarNode('port')->end()
->scalarNode('instance_class')->end()
->scalarNode('class')->end()
->end()
;

return $node;
Expand Down
Expand Up @@ -2,7 +2,6 @@

namespace Symfony\Bundle\DoctrineMigrationsBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\NodeBuilder;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;

/**
Expand All @@ -15,18 +14,21 @@ class Configuration
/**
* Generates the configuration tree.
*
* @return \Symfony\Component\Config\Definition\NodeInterface
* @return NodeInterface
*/
public function getConfigTree()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine_migrations', 'array');

$rootNode
->scalarNode('dir_name')->defaultValue('%kernel.root_dir%/DoctrineMigrations')->cannotBeEmpty()->end()
->scalarNode('namespace')->defaultValue('Application\Migrations')->cannotBeEmpty()->end()
->scalarNode('table_name')->defaultValue('migration_versions')->cannotBeEmpty()->end()
->scalarNode('name')->defaultValue('Application Migrations')->end();
->children()
->scalarNode('dir_name')->defaultValue('%kernel.root_dir%/DoctrineMigrations')->cannotBeEmpty()->end()
->scalarNode('namespace')->defaultValue('Application\Migrations')->cannotBeEmpty()->end()
->scalarNode('table_name')->defaultValue('migration_versions')->cannotBeEmpty()->end()
->scalarNode('name')->defaultValue('Application Migrations')->end()
->end()
;

return $treeBuilder->buildTree();
}
Expand Down

0 comments on commit 1e0ed22

Please sign in to comment.