Configuration.php 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Symfony\Bundle\DoctrineBundle\DependencyInjection;
  11. use Symfony\Component\Config\Definition\Builder\NodeBuilder;
  12. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  13. /**
  14. * This class contains the configuration information for the bundle
  15. *
  16. * This information is solely responsible for how the different configuration
  17. * sections are normalized, and merged.
  18. *
  19. * @author Christophe Coevoet <stof@notk.org>
  20. */
  21. class Configuration
  22. {
  23. private $kernelDebug;
  24. /**
  25. * Generates the configuration tree.
  26. *
  27. * @param Boolean $kernelDebug
  28. * @return \Symfony\Component\Config\Definition\NodeInterface
  29. */
  30. public function getConfigTree($kernelDebug)
  31. {
  32. $this->kernelDebug = (bool) $kernelDebug;
  33. $treeBuilder = new TreeBuilder();
  34. $rootNode = $treeBuilder->root('doctrine', 'array');
  35. $this->addDbalSection($rootNode);
  36. $this->addOrmSection($rootNode);
  37. return $treeBuilder->buildTree();
  38. }
  39. private function addDbalSection(NodeBuilder $node)
  40. {
  41. $node
  42. ->arrayNode('dbal')
  43. ->beforeNormalization()
  44. ->ifNull()
  45. // Define a default connection using the default values
  46. ->then(function($v) { return array ('default_connection' => 'default', 'connections' => array('default' => array())); })
  47. ->end()
  48. ->scalarNode('default_connection')->isRequired()->cannotBeEmpty()->end()
  49. ->fixXmlConfig('type')
  50. ->arrayNode('types')
  51. ->useAttributeAsKey('name')
  52. ->prototype('scalar')
  53. ->beforeNormalization()
  54. ->ifTrue(function($v) { return is_array($v) && isset($v['class']); })
  55. ->then(function($v) { return $v['class']; })
  56. ->end()
  57. ->end()
  58. ->end()
  59. ->fixXmlConfig('connection')
  60. ->builder($this->getDbalConnectionsNode())
  61. ->end()
  62. ;
  63. }
  64. private function getDbalConnectionsNode()
  65. {
  66. $node = new NodeBuilder('connections', 'array');
  67. $node
  68. ->requiresAtLeastOneElement()
  69. ->useAttributeAsKey('name')
  70. ->prototype('array')
  71. ->scalarNode('dbname')->end()
  72. ->scalarNode('host')->defaultValue('localhost')->end()
  73. ->scalarNode('port')->defaultNull()->end()
  74. ->scalarNode('user')->defaultValue('root')->end()
  75. ->scalarNode('password')->defaultNull()->end()
  76. ->scalarNode('driver')->defaultValue('pdo_mysql')->end()
  77. ->fixXmlConfig('driver_class', 'driverClass')
  78. ->scalarNode('driver_class')->end()
  79. ->fixXmlConfig('options', 'driverOptions')
  80. ->arrayNode('driverOptions')
  81. ->useAttributeAsKey('key')
  82. ->prototype('scalar')->end()
  83. ->end()
  84. ->scalarNode('path')->end()
  85. ->booleanNode('memory')->end()
  86. ->scalarNode('unix_socket')->end()
  87. ->fixXmlConfig('wrapper_class', 'wrapperClass')
  88. ->scalarNode('wrapper_class')->end()
  89. ->scalarNode('platform_service')->end()
  90. ->scalarNode('charset')->end()
  91. ->booleanNode('logging')->defaultValue($this->kernelDebug)->end()
  92. ->end()
  93. ;
  94. return $node;
  95. }
  96. private function addOrmSection(NodeBuilder $node)
  97. {
  98. $node
  99. ->arrayNode('orm')
  100. ->scalarNode('default_entity_manager')->isRequired()->cannotBeEmpty()->end()
  101. ->booleanNode('auto_generate_proxy_classes')->defaultFalse()->end()
  102. ->scalarNode('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/orm/Proxies')->end()
  103. ->scalarNode('proxy_namespace')->defaultValue('Proxies')->end()
  104. ->fixXmlConfig('entity_manager')
  105. ->builder($this->getOrmEntityManagersNode())
  106. ->end()
  107. ;
  108. }
  109. private function getOrmEntityManagersNode()
  110. {
  111. $node = new NodeBuilder('entity_managers', 'array');
  112. $node
  113. ->requiresAtLeastOneElement()
  114. ->useAttributeAsKey('name')
  115. ->prototype('array')
  116. ->addDefaultsIfNotSet()
  117. ->builder($this->getOrmCacheDriverNode('query_cache_driver'))
  118. ->builder($this->getOrmCacheDriverNode('metadata_cache_driver'))
  119. ->builder($this->getOrmCacheDriverNode('result_cache_driver'))
  120. ->scalarNode('connection')->end()
  121. ->scalarNode('class_metadata_factory_name')->defaultValue('%doctrine.orm.class_metadata_factory_name%')->end()
  122. ->fixXmlConfig('mapping')
  123. ->arrayNode('mappings')
  124. ->isRequired()
  125. ->requiresAtLeastOneElement()
  126. ->useAttributeAsKey('name')
  127. ->prototype('array')
  128. ->beforeNormalization()
  129. ->ifString()
  130. ->then(function($v) { return array ('type' => $v); })
  131. ->end()
  132. ->treatNullLike(array ())
  133. ->scalarNode('type')->end()
  134. ->scalarNode('dir')->end()
  135. ->scalarNode('alias')->end()
  136. ->scalarNode('prefix')->end()
  137. ->booleanNode('is_bundle')->end()
  138. ->performNoDeepMerging()
  139. ->end()
  140. ->end()
  141. ->end()
  142. ;
  143. return $node;
  144. }
  145. private function getOrmCacheDriverNode($name)
  146. {
  147. $node = new NodeBuilder($name, 'array');
  148. $node
  149. ->addDefaultsIfNotSet()
  150. ->beforeNormalization()
  151. ->ifString()
  152. ->then(function($v) { return array ('type' => $v); })
  153. ->end()
  154. ->scalarNode('type')->defaultValue('array')->isRequired()->end()
  155. ->scalarNode('host')->end()
  156. ->scalarNode('port')->end()
  157. ->scalarNode('instance_class')->end()
  158. ->scalarNode('class')->end()
  159. ;
  160. return $node;
  161. }
  162. }