Skip to content

Commit

Permalink
Added a Configuration class for DoctrineBundle
Browse files Browse the repository at this point in the history
  • Loading branch information
stof committed Mar 9, 2011
1 parent 689f0e1 commit 652bca1
Showing 1 changed file with 195 additions and 0 deletions.
@@ -0,0 +1,195 @@
<?php

/*
* This file is part of the Symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

namespace Symfony\Bundle\DoctrineBundle\DependencyInjection;

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

/**
* This class contains the configuration information for the bundle
*
* This information is solely responsible for how the different configuration
* sections are normalized, and merged.
*
* @author Christophe Coevoet <stof@notk.org>
*/
class Configuration
{
/**
* Generates the configuration tree.
*
* @return \Symfony\Component\Config\Definition\NodeInterface
*/
public function getConfigTree()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('doctrine', 'array');

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

return $treeBuilder->buildTree();
}

private function addDbalSection(NodeBuilder $node)
{
$node
->arrayNode('dbal')
->beforeNormalization()
->ifTrue(function($v){ return is_array($v) && !array_key_exists('connections', $v) && !array_key_exists('connection', $v); })
->then(function($v) {
$connection = array ();
$keys = array ('dbname', 'host', 'port', 'user', 'password', 'driver', 'driver_class', 'options', 'path', 'memory', 'unix_socket', 'wrapper_class', 'platform_service', 'charset', 'logging');
foreach ($keys as $key) {
if (array_key_exists($key, $v)) {
$connection[$key] = $v[$key];
unset($v[$key]);
}
}
$defaultConnection = isset($v['default_connection']) ? (string) $v['default_connection'] : 'default';
$v['connections'] = array ($defaultConnection => $connection);
$v['default_connection'] = $defaultConnection;
return $v;
})
->end()
->scalarNode('default_connection')->isRequired()->cannotBeEmpty()->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']; })
->end()
->end()
->end()
->fixXmlConfig('connection')
->builder($this->getDbalConnectionsNode())
->end()
;
}

private function getDbalConnectionsNode()
{
$node = new NodeBuilder('connections', 'array');
$node
->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()
->scalarNode('driver_class')->end()
->arrayNode('options')
->useAttributeAsKey('key')
->prototype('scalar')->end()
->end()
->scalarNode('path')->end()
->booleanNode('memory')->end()
->scalarNode('unix_socket')->end()
->scalarNode('wrapper_class')->end()
->scalarNode('platform_service')->end()
->scalarNode('charset')->defaultValue('UTF-8')->end()
->booleanNode('logging')->defaultFalse()->end()
->end()
;

return $node;
}

private function addOrmSection(NodeBuilder $node)
{
$node
->arrayNode('orm')
->beforeNormalization()
->ifTrue(function($v){ return is_array($v) && !array_key_exists('entity_managers', $v) && !array_key_exists('entity_manager', $v); })
->then(function($v) {
$entityManager = array ();
$keys = array ('result_cache_driver', 'metadata_cache_driver', 'query_cache_driver', 'mappings');
foreach ($keys as $key) {
if (array_key_exists($key, $v)) {
$entityManagers[$key] = $v[$key];
unset($v[$key]);
}
}
if (!empty ($entityManager)) {
$defaultEntityManager = isset($v['default_entity_manager']) ? (string) $v['default_entity_manager'] : 'default';
$v['entity_managers'] = array ($defaultEntityManager => $entityManager);
$v['default_entity_manager'] = $defaultEntityManager;
}
return $v;
})
->end()
->scalarNode('default_entity_manager')->isRequired()->cannotBeEmpty()->end()
->booleanNode('auto_generate_proxy_classes')->defaultFalse()->end()
->fixXmlConfig('entity_manager')
->builder($this->getOrmEntityManagersNode())
->end()
;
}

private function getOrmEntityManagersNode()
{
$node = new NodeBuilder('entity_managers', 'array');
$node
->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('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/orm/Proxies')->end()
->scalarNode('proxy_namespace')->defaultValue('Proxies')->end()
->scalarNode('class_metadata_factory_name')->end()
->fixXmlConfig('mapping')
->arrayNode('mappings')
->useAttributeAsKey('name')
->treatNullLike(array ())
->prototype('array')
->beforeNormalization()
->ifString()
->then(function($v) { return array ('type' => $v); })
->end()
->scalarNode('type')->end()
->scalarNode('dir')->end()
->scalarNode('alias')->end()
->scalarNode('prefix')->end()
->booleanNode('is_bundle')->end()
->performNoDeepMerging()
->end()
->end()
->end()
;

return $node;
}

private function getOrmCacheDriverNode($name)
{
$node = new NodeBuilder($name, 'array');
$node
->beforeNormalization()
->ifString()
->then(function($v) { return array ('type' => $v); })
->end()
->scalarNode('type')->defaultValue('array')->end()
->scalarNode('host')->end()
->scalarNode('port')->end()
->scalarNode('instance_class')->end()
;

return $node;
}
}

0 comments on commit 652bca1

Please sign in to comment.