Configuration.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <?php
  2. namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
  3. use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
  4. use Symfony\Component\Config\Definition\Builder\TreeBuilder;
  5. /**
  6. * FrameworkExtension configuration structure.
  7. *
  8. * @author Jeremy Mikola <jmikola@gmail.com>
  9. */
  10. class Configuration
  11. {
  12. /**
  13. * Generates the configuration tree.
  14. *
  15. * @param boolean $kernelDebug The kernel.debug DIC parameter
  16. *
  17. * @return \Symfony\Component\Config\Definition\ArrayNode The config tree
  18. */
  19. public function getConfigTree($kernelDebug)
  20. {
  21. $treeBuilder = new TreeBuilder();
  22. $rootNode = $treeBuilder->root('framework');
  23. $rootNode
  24. ->children()
  25. ->scalarNode('cache_warmer')->defaultValue(!$kernelDebug)->end()
  26. ->scalarNode('charset')->end()
  27. ->scalarNode('document_root')->end()
  28. ->scalarNode('error_handler')->end()
  29. ->scalarNode('exception_controller')->end()
  30. ->scalarNode('ide')->end()
  31. ->booleanNode('test')->end()
  32. ->end()
  33. ;
  34. $this->addCsrfProtectionSection($rootNode);
  35. $this->addEsiSection($rootNode);
  36. $this->addProfilerSection($rootNode);
  37. $this->addRouterSection($rootNode);
  38. $this->addSessionSection($rootNode);
  39. $this->addTemplatingSection($rootNode);
  40. $this->addTranslatorSection($rootNode);
  41. $this->addValidationSection($rootNode);
  42. return $treeBuilder->buildTree();
  43. }
  44. private function addCsrfProtectionSection(ArrayNodeDefinition $rootNode)
  45. {
  46. $rootNode
  47. ->children()
  48. ->arrayNode('csrf_protection')
  49. ->canBeUnset()
  50. ->treatNullLike(array('enabled' => true))
  51. ->treatTrueLike(array('enabled' => true))
  52. ->children()
  53. ->booleanNode('enabled')->end()
  54. ->scalarNode('field_name')->end()
  55. ->scalarNode('secret')->end()
  56. ->end()
  57. ->end()
  58. ->end()
  59. ;
  60. }
  61. private function addEsiSection(ArrayNodeDefinition $rootNode)
  62. {
  63. $rootNode
  64. ->children()
  65. ->arrayNode('esi')
  66. ->canBeUnset()
  67. ->treatNullLike(array('enabled' => true))
  68. ->treatTrueLike(array('enabled' => true))
  69. ->children()
  70. ->booleanNode('enabled')->end()
  71. ->end()
  72. ->end()
  73. ->end()
  74. ;
  75. }
  76. private function addProfilerSection(ArrayNodeDefinition $rootNode)
  77. {
  78. $rootNode
  79. ->children()
  80. ->arrayNode('profiler')
  81. ->canBeUnset()
  82. ->children()
  83. ->booleanNode('only_exceptions')->defaultValue(false)->end()
  84. ->scalarNode('dsn')->defaultValue('sqlite:%kernel.cache_dir%/profiler.db')->end()
  85. ->scalarNode('username')->defaultValue('')->end()
  86. ->scalarNode('password')->defaultValue('')->end()
  87. ->scalarNode('lifetime')->defaultValue(86400)->end()
  88. ->arrayNode('matcher')
  89. ->canBeUnset()
  90. ->performNoDeepMerging()
  91. ->children()
  92. ->scalarNode('ip')->end()
  93. ->scalarNode('path')->end()
  94. ->scalarNode('service')->end()
  95. ->end()
  96. ->end()
  97. ->end()
  98. ->end()
  99. ->end()
  100. ;
  101. }
  102. private function addRouterSection(ArrayNodeDefinition $rootNode)
  103. {
  104. $rootNode
  105. ->children()
  106. ->arrayNode('router')
  107. ->canBeUnset()
  108. ->children()
  109. ->scalarNode('cache_warmer')->end()
  110. ->scalarNode('resource')->isRequired()->end()
  111. ->scalarNode('type')->end()
  112. ->end()
  113. ->end()
  114. ->end()
  115. ;
  116. }
  117. private function addSessionSection(ArrayNodeDefinition $rootNode)
  118. {
  119. $rootNode
  120. ->children()
  121. ->arrayNode('session')
  122. ->canBeUnset()
  123. // Strip "pdo." prefix from option keys, since dots cannot appear in node names
  124. ->beforeNormalization()
  125. ->ifArray()
  126. ->then(function($v){
  127. foreach ($v as $key => $value) {
  128. if (0 === strncmp('pdo.', $key, 4)) {
  129. $v[substr($key, 4)] = $value;
  130. unset($v[$key]);
  131. }
  132. }
  133. return $v;
  134. })
  135. ->end()
  136. ->children()
  137. ->booleanNode('auto_start')->end()
  138. ->scalarNode('class')->end()
  139. ->scalarNode('default_locale')->end()
  140. ->scalarNode('storage_id')->defaultValue('native')->end()
  141. // NativeSessionStorage options
  142. ->scalarNode('name')->end()
  143. ->scalarNode('lifetime')->end()
  144. ->scalarNode('path')->end()
  145. ->scalarNode('domain')->end()
  146. ->booleanNode('secure')->end()
  147. ->booleanNode('httponly')->end()
  148. // PdoSessionStorage options
  149. ->scalarNode('db_table')->end()
  150. ->scalarNode('db_id_col')->end()
  151. ->scalarNode('db_data_col')->end()
  152. ->scalarNode('db_time_col')->end()
  153. ->end()
  154. ->end()
  155. ->end()
  156. ;
  157. }
  158. private function addTemplatingSection(ArrayNodeDefinition $rootNode)
  159. {
  160. $rootNode
  161. ->children()
  162. ->arrayNode('templating')
  163. ->canBeUnset()
  164. ->children()
  165. ->scalarNode('assets_version')->end()
  166. ->end()
  167. ->fixXmlConfig('assets_base_url')
  168. ->children()
  169. ->arrayNode('assets_base_urls')
  170. ->beforeNormalization()
  171. ->ifTrue(function($v){ return !is_array($v); })
  172. ->then(function($v){ return array($v); })
  173. ->end()
  174. ->prototype('scalar')
  175. ->beforeNormalization()
  176. ->ifTrue(function($v) { return is_array($v) && isset($v['value']); })
  177. ->then(function($v){ return $v['value']; })
  178. ->end()
  179. ->end()
  180. ->end()
  181. ->scalarNode('cache')->end()
  182. ->scalarNode('cache_warmer')->end()
  183. ->end()
  184. ->fixXmlConfig('engine')
  185. ->children()
  186. ->arrayNode('engines')
  187. ->isRequired()
  188. ->requiresAtLeastOneElement()
  189. ->beforeNormalization()
  190. ->ifTrue(function($v){ return !is_array($v); })
  191. ->then(function($v){ return array($v); })
  192. ->end()
  193. ->prototype('scalar')
  194. ->beforeNormalization()
  195. ->ifTrue(function($v) { return is_array($v) && isset($v['id']); })
  196. ->then(function($v){ return $v['id']; })
  197. ->end()
  198. ->end()
  199. ->end()
  200. ->end()
  201. ->fixXmlConfig('loader')
  202. ->children()
  203. ->arrayNode('loaders')
  204. ->beforeNormalization()
  205. ->ifTrue(function($v){ return !is_array($v); })
  206. ->then(function($v){ return array($v); })
  207. ->end()
  208. ->prototype('scalar')->end()
  209. ->end()
  210. ->end()
  211. ->fixXmlConfig('package')
  212. ->children()
  213. ->arrayNode('packages')
  214. ->useAttributeAsKey('name')
  215. ->prototype('array')
  216. ->children()
  217. ->scalarNode('version')->defaultNull()->end()
  218. ->end()
  219. ->fixXmlConfig('base_url')
  220. ->children()
  221. ->arrayNode('base_urls')
  222. ->prototype('scalar')
  223. ->beforeNormalization()
  224. ->ifTrue(function($v) { return is_array($v) && isset($v['value']); })
  225. ->then(function($v){ return $v['value']; })
  226. ->end()
  227. ->end()
  228. ->end()
  229. ->end()
  230. ->end()
  231. ->end()
  232. ->end()
  233. ->end()
  234. ->end()
  235. ;
  236. }
  237. private function addTranslatorSection(ArrayNodeDefinition $rootNode)
  238. {
  239. $rootNode
  240. ->children()
  241. ->arrayNode('translator')
  242. ->canBeUnset()
  243. ->children()
  244. ->booleanNode('enabled')->defaultTrue()->end()
  245. ->scalarNode('fallback')->end()
  246. ->end()
  247. ->end()
  248. ->end()
  249. ;
  250. }
  251. private function addValidationSection(ArrayNodeDefinition $rootNode)
  252. {
  253. $rootNode
  254. ->children()
  255. ->arrayNode('validation')
  256. ->canBeUnset()
  257. // For XML, namespace is a child of validation, so it must be moved under annotations
  258. ->beforeNormalization()
  259. ->ifTrue(function($v) { return is_array($v) && !empty($v['annotations']) && !empty($v['namespace']); })
  260. ->then(function($v){
  261. $v['annotations'] = array('namespace' => $v['namespace']);
  262. unset($v['namespace']);
  263. return $v;
  264. })
  265. ->end()
  266. ->children()
  267. ->booleanNode('enabled')->end()
  268. ->arrayNode('annotations')
  269. ->canBeUnset()
  270. ->treatNullLike(array())
  271. ->treatTrueLike(array())
  272. ->fixXmlConfig('namespace')
  273. ->children()
  274. ->arrayNode('namespaces')
  275. ->useAttributeAsKey('prefix')
  276. ->prototype('scalar')
  277. ->beforeNormalization()
  278. ->ifTrue(function($v) { return is_array($v) && isset($v['namespace']); })
  279. ->then(function($v){ return $v['namespace']; })
  280. ->end()
  281. ->end()
  282. ->end()
  283. ->end()
  284. ->end()
  285. ->end()
  286. ->end()
  287. ->end()
  288. ;
  289. }
  290. }