Added a Configuration class for DoctrineBundle
This commit is contained in:
parent
689f0e1d58
commit
652bca131d
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user