diff --git a/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/Configuration.php new file mode 100644 index 000000000000..ed38e10af759 --- /dev/null +++ b/src/Symfony/Bundle/DoctrineBundle/DependencyInjection/Configuration.php @@ -0,0 +1,195 @@ + + * + * 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 + */ +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; + } +}