Configuration.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. /*
  3. * This file is part of the Symfony package.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.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\ArrayNodeDefinition;
  12. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  13. use Symfony\Component\Config\Definition\ConfigurationInterface;
  14. /**
  15. * This class contains the configuration information for the bundle
  16. *
  17. * This information is solely responsible for how the different configuration
  18. * sections are normalized, and merged.
  19. *
  20. * @author Christophe Coevoet <stof@notk.org>
  21. */
  22. class Configuration implements ConfigurationInterface
  23. {
  24. private $debug;
  25. /**
  26. * Constructor
  27. *
  28. * @param Boolean $debug Whether to use the debug mode
  29. */
  30. public function __construct($debug)
  31. {
  32. $this->debug = (Boolean) $debug;
  33. }
  34. /**
  35. * Generates the configuration tree builder.
  36. *
  37. * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
  38. */
  39. public function getConfigTreeBuilder()
  40. {
  41. $treeBuilder = new TreeBuilder();
  42. $rootNode = $treeBuilder->root('doctrine');
  43. $this->addDbalSection($rootNode);
  44. $this->addOrmSection($rootNode);
  45. return $treeBuilder;
  46. }
  47. private function addDbalSection(ArrayNodeDefinition $node)
  48. {
  49. $node
  50. ->children()
  51. ->arrayNode('dbal')
  52. ->beforeNormalization()
  53. ->ifTrue(function ($v) { return is_array($v) && !array_key_exists('connections', $v) && !array_key_exists('connection', $v); })
  54. ->then(function ($v) {
  55. $connection = array();
  56. foreach (array(
  57. 'dbname',
  58. 'host',
  59. 'port',
  60. 'user',
  61. 'password',
  62. 'driver',
  63. 'driver_class',
  64. 'options',
  65. 'path',
  66. 'memory',
  67. 'unix_socket',
  68. 'wrapper_class',
  69. 'platform_service',
  70. 'charset',
  71. 'logging',
  72. 'mapping_types',
  73. ) as $key) {
  74. if (array_key_exists($key, $v)) {
  75. $connection[$key] = $v[$key];
  76. unset($v[$key]);
  77. }
  78. }
  79. $v['default_connection'] = isset($v['default_connection']) ? (string) $v['default_connection'] : 'default';
  80. $v['connections'] = array($v['default_connection'] => $connection);
  81. return $v;
  82. })
  83. ->end()
  84. ->children()
  85. ->scalarNode('default_connection')->end()
  86. ->end()
  87. ->fixXmlConfig('type')
  88. ->children()
  89. ->arrayNode('types')
  90. ->useAttributeAsKey('name')
  91. ->prototype('scalar')->end()
  92. ->end()
  93. ->end()
  94. ->fixXmlConfig('connection')
  95. ->append($this->getDbalConnectionsNode())
  96. ->end()
  97. ;
  98. }
  99. private function getDbalConnectionsNode()
  100. {
  101. $treeBuilder = new TreeBuilder();
  102. $node = $treeBuilder->root('connections');
  103. $node
  104. ->requiresAtLeastOneElement()
  105. ->useAttributeAsKey('name')
  106. ->prototype('array')
  107. ->fixXmlConfig('mapping_type')
  108. ->children()
  109. ->scalarNode('dbname')->end()
  110. ->scalarNode('host')->defaultValue('localhost')->end()
  111. ->scalarNode('port')->defaultNull()->end()
  112. ->scalarNode('user')->defaultValue('root')->end()
  113. ->scalarNode('password')->defaultNull()->end()
  114. ->scalarNode('driver')->defaultValue('pdo_mysql')->end()
  115. ->scalarNode('path')->end()
  116. ->booleanNode('memory')->end()
  117. ->scalarNode('unix_socket')->end()
  118. ->scalarNode('platform_service')->end()
  119. ->scalarNode('charset')->end()
  120. ->booleanNode('logging')->defaultValue($this->debug)->end()
  121. ->scalarNode('driver_class')->end()
  122. ->scalarNode('wrapper_class')->end()
  123. ->arrayNode('options')
  124. ->useAttributeAsKey('key')
  125. ->prototype('scalar')->end()
  126. ->end()
  127. ->arrayNode('mapping_types')
  128. ->useAttributeAsKey('name')
  129. ->prototype('scalar')->end()
  130. ->end()
  131. ->end()
  132. ->end()
  133. ;
  134. return $node;
  135. }
  136. private function addOrmSection(ArrayNodeDefinition $node)
  137. {
  138. $node
  139. ->children()
  140. ->arrayNode('orm')
  141. ->beforeNormalization()
  142. ->ifTrue(function ($v) { return null === $v || (is_array($v) && !array_key_exists('entity_managers', $v) && !array_key_exists('entity_manager', $v)); })
  143. ->then(function ($v) {
  144. $v = (array) $v;
  145. $entityManager = array();
  146. foreach (array(
  147. 'result_cache_driver', 'result-cache-driver',
  148. 'metadata_cache_driver', 'metadata-cache-driver',
  149. 'query_cache_driver', 'query-cache-driver',
  150. 'auto_mapping', 'auto-mapping',
  151. 'mappings', 'mapping',
  152. 'connection', 'dql'
  153. ) as $key) {
  154. if (array_key_exists($key, $v)) {
  155. $entityManager[$key] = $v[$key];
  156. unset($v[$key]);
  157. }
  158. }
  159. $v['default_entity_manager'] = isset($v['default_entity_manager']) ? (string) $v['default_entity_manager'] : 'default';
  160. $v['entity_managers'] = array($v['default_entity_manager'] => $entityManager);
  161. return $v;
  162. })
  163. ->end()
  164. ->children()
  165. ->scalarNode('default_entity_manager')->end()
  166. ->booleanNode('auto_generate_proxy_classes')->defaultFalse()->end()
  167. ->scalarNode('proxy_dir')->defaultValue('%kernel.cache_dir%/doctrine/orm/Proxies')->end()
  168. ->scalarNode('proxy_namespace')->defaultValue('Proxies')->end()
  169. ->end()
  170. ->fixXmlConfig('entity_manager')
  171. ->append($this->getOrmEntityManagersNode())
  172. ->end()
  173. ->end()
  174. ;
  175. }
  176. private function getOrmEntityManagersNode()
  177. {
  178. $treeBuilder = new TreeBuilder();
  179. $node = $treeBuilder->root('entity_managers');
  180. $node
  181. ->requiresAtLeastOneElement()
  182. ->useAttributeAsKey('name')
  183. ->prototype('array')
  184. ->addDefaultsIfNotSet()
  185. ->append($this->getOrmCacheDriverNode('query_cache_driver'))
  186. ->append($this->getOrmCacheDriverNode('metadata_cache_driver'))
  187. ->append($this->getOrmCacheDriverNode('result_cache_driver'))
  188. ->children()
  189. ->scalarNode('connection')->end()
  190. ->scalarNode('class_metadata_factory_name')->defaultValue('Doctrine\ORM\Mapping\ClassMetadataFactory')->end()
  191. ->scalarNode('auto_mapping')->defaultFalse()->end()
  192. ->end()
  193. ->fixXmlConfig('hydrator')
  194. ->children()
  195. ->arrayNode('hydrators')
  196. ->useAttributeAsKey('name')
  197. ->prototype('scalar')->end()
  198. ->end()
  199. ->end()
  200. ->fixXmlConfig('mapping')
  201. ->children()
  202. ->arrayNode('mappings')
  203. ->useAttributeAsKey('name')
  204. ->prototype('array')
  205. ->beforeNormalization()
  206. ->ifString()
  207. ->then(function($v) { return array('type' => $v); })
  208. ->end()
  209. ->treatNullLike(array())
  210. ->treatFalseLike(array('mapping' => false))
  211. ->performNoDeepMerging()
  212. ->children()
  213. ->scalarNode('mapping')->defaultValue(true)->end()
  214. ->scalarNode('type')->end()
  215. ->scalarNode('dir')->end()
  216. ->scalarNode('alias')->end()
  217. ->scalarNode('prefix')->end()
  218. ->booleanNode('is_bundle')->end()
  219. ->end()
  220. ->end()
  221. ->end()
  222. ->arrayNode('dql')
  223. ->fixXmlConfig('string_function')
  224. ->fixXmlConfig('numeric_function')
  225. ->fixXmlConfig('datetime_function')
  226. ->children()
  227. ->arrayNode('string_functions')
  228. ->useAttributeAsKey('name')
  229. ->prototype('scalar')->end()
  230. ->end()
  231. ->arrayNode('numeric_functions')
  232. ->useAttributeAsKey('name')
  233. ->prototype('scalar')->end()
  234. ->end()
  235. ->arrayNode('datetime_functions')
  236. ->useAttributeAsKey('name')
  237. ->prototype('scalar')->end()
  238. ->end()
  239. ->end()
  240. ->end()
  241. ->end()
  242. ->end()
  243. ;
  244. return $node;
  245. }
  246. private function getOrmCacheDriverNode($name)
  247. {
  248. $treeBuilder = new TreeBuilder();
  249. $node = $treeBuilder->root($name);
  250. $node
  251. ->addDefaultsIfNotSet()
  252. ->beforeNormalization()
  253. ->ifString()
  254. ->then(function($v) { return array('type' => $v); })
  255. ->end()
  256. ->children()
  257. ->scalarNode('type')->defaultValue('array')->isRequired()->end()
  258. ->scalarNode('host')->end()
  259. ->scalarNode('port')->end()
  260. ->scalarNode('instance_class')->end()
  261. ->scalarNode('class')->end()
  262. ->end()
  263. ;
  264. return $node;
  265. }
  266. }