Configuration.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <?php
  2. /*
  3. * This file is part of the Symfony framework.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. *
  7. * This source file is subject to the MIT license that is bundled
  8. * with this source code in the file LICENSE.
  9. */
  10. namespace Symfony\Bundle\FrameworkBundle\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. * FrameworkExtension configuration structure.
  16. *
  17. * @author Jeremy Mikola <jmikola@gmail.com>
  18. */
  19. class Configuration implements ConfigurationInterface
  20. {
  21. private $debug;
  22. /**
  23. * Constructor
  24. *
  25. * @param Boolean $debug Whether to use the debug mode
  26. */
  27. public function __construct($debug)
  28. {
  29. $this->debug = (Boolean) $debug;
  30. }
  31. /**
  32. * Generates the configuration tree builder.
  33. *
  34. * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder
  35. */
  36. public function getConfigTreeBuilder()
  37. {
  38. $treeBuilder = new TreeBuilder();
  39. $rootNode = $treeBuilder->root('framework');
  40. $rootNode
  41. ->children()
  42. ->scalarNode('charset')->end()
  43. ->scalarNode('trust_proxy_headers')->defaultFalse()->end()
  44. ->scalarNode('secret')->isRequired()->end()
  45. ->scalarNode('exception_controller')->defaultValue('Symfony\\Bundle\\FrameworkBundle\\Controller\\ExceptionController::showAction')->end()
  46. ->scalarNode('ide')->defaultNull()->end()
  47. ->booleanNode('test')->end()
  48. ->end()
  49. ;
  50. $this->addFormSection($rootNode);
  51. $this->addEsiSection($rootNode);
  52. $this->addProfilerSection($rootNode);
  53. $this->addRouterSection($rootNode);
  54. $this->addSessionSection($rootNode);
  55. $this->addTemplatingSection($rootNode);
  56. $this->addTranslatorSection($rootNode);
  57. $this->addValidationSection($rootNode);
  58. $this->addAnnotationsSection($rootNode);
  59. return $treeBuilder;
  60. }
  61. private function addFormSection(ArrayNodeDefinition $rootNode)
  62. {
  63. $rootNode
  64. ->children()
  65. ->arrayNode('form')
  66. ->canBeUnset()
  67. ->treatNullLike(array('enabled' => true))
  68. ->treatTrueLike(array('enabled' => true))
  69. ->children()
  70. ->booleanNode('enabled')->defaultTrue()->end()
  71. ->end()
  72. ->end()
  73. ->arrayNode('csrf_protection')
  74. ->canBeUnset()
  75. ->treatNullLike(array('enabled' => true))
  76. ->treatTrueLike(array('enabled' => true))
  77. ->children()
  78. ->booleanNode('enabled')->defaultTrue()->end()
  79. ->scalarNode('field_name')->defaultValue('_token')->end()
  80. ->end()
  81. ->end()
  82. ->end()
  83. ;
  84. }
  85. private function addEsiSection(ArrayNodeDefinition $rootNode)
  86. {
  87. $rootNode
  88. ->children()
  89. ->arrayNode('esi')
  90. ->canBeUnset()
  91. ->treatNullLike(array('enabled' => true))
  92. ->treatTrueLike(array('enabled' => true))
  93. ->children()
  94. ->booleanNode('enabled')->defaultTrue()->end()
  95. ->end()
  96. ->end()
  97. ->end()
  98. ;
  99. }
  100. private function addProfilerSection(ArrayNodeDefinition $rootNode)
  101. {
  102. $rootNode
  103. ->children()
  104. ->arrayNode('profiler')
  105. ->canBeUnset()
  106. ->children()
  107. ->booleanNode('only_exceptions')->defaultFalse()->end()
  108. ->booleanNode('only_master_requests')->defaultFalse()->end()
  109. ->scalarNode('dsn')->defaultValue('sqlite:%kernel.cache_dir%/profiler.db')->end()
  110. ->scalarNode('username')->defaultValue('')->end()
  111. ->scalarNode('password')->defaultValue('')->end()
  112. ->scalarNode('lifetime')->defaultValue(86400)->end()
  113. ->arrayNode('matcher')
  114. ->canBeUnset()
  115. ->performNoDeepMerging()
  116. ->children()
  117. ->scalarNode('ip')->end()
  118. ->scalarNode('path')->end()
  119. ->scalarNode('service')->end()
  120. ->end()
  121. ->end()
  122. ->end()
  123. ->end()
  124. ->end()
  125. ;
  126. }
  127. private function addRouterSection(ArrayNodeDefinition $rootNode)
  128. {
  129. $rootNode
  130. ->children()
  131. ->arrayNode('router')
  132. ->canBeUnset()
  133. ->children()
  134. ->scalarNode('resource')->isRequired()->end()
  135. ->scalarNode('type')->end()
  136. ->scalarNode('http_port')->defaultValue(80)->end()
  137. ->scalarNode('https_port')->defaultValue(443)->end()
  138. ->end()
  139. ->end()
  140. ->end()
  141. ;
  142. }
  143. private function addSessionSection(ArrayNodeDefinition $rootNode)
  144. {
  145. $rootNode
  146. ->children()
  147. ->arrayNode('session')
  148. ->canBeUnset()
  149. ->children()
  150. ->booleanNode('auto_start')->end()
  151. ->scalarNode('default_locale')->defaultValue('en')->end()
  152. ->scalarNode('storage_id')->defaultValue('session.storage.native')->end()
  153. ->scalarNode('name')->end()
  154. ->scalarNode('lifetime')->end()
  155. ->scalarNode('path')->end()
  156. ->scalarNode('domain')->end()
  157. ->booleanNode('secure')->end()
  158. ->booleanNode('httponly')->end()
  159. ->end()
  160. ->end()
  161. ->end()
  162. ;
  163. }
  164. private function addTemplatingSection(ArrayNodeDefinition $rootNode)
  165. {
  166. $organizeUrls = function($urls)
  167. {
  168. $urls += array(
  169. 'http' => array(),
  170. 'ssl' => array(),
  171. );
  172. foreach ($urls as $i => $url) {
  173. if (is_integer($i)) {
  174. if (0 === strpos($url, 'https://') || 0 === strpos($url, '//')) {
  175. $urls['http'][] = $urls['ssl'][] = $url;
  176. } else {
  177. $urls['http'][] = $url;
  178. }
  179. unset($urls[$i]);
  180. }
  181. }
  182. return $urls;
  183. };
  184. $rootNode
  185. ->children()
  186. ->arrayNode('templating')
  187. ->canBeUnset()
  188. ->children()
  189. ->scalarNode('assets_version')->defaultValue(null)->end()
  190. ->scalarNode('assets_version_format')->defaultValue(null)->end()
  191. ->arrayNode('form')
  192. ->addDefaultsIfNotSet()
  193. ->fixXmlConfig('resource')
  194. ->children()
  195. ->arrayNode('resources')
  196. ->addDefaultsIfNotSet()
  197. ->defaultValue(array('FrameworkBundle:Form'))
  198. ->validate()
  199. ->ifTrue(function($v) {return !in_array('FrameworkBundle:Form', $v); })
  200. ->then(function($v){
  201. return array_merge(array('FrameworkBundle:Form'), $v);
  202. })
  203. ->end()
  204. ->prototype('scalar')->end()
  205. ->end()
  206. ->end()
  207. ->end()
  208. ->end()
  209. ->fixXmlConfig('assets_base_url')
  210. ->children()
  211. ->arrayNode('assets_base_urls')
  212. ->addDefaultsIfNotSet()
  213. ->defaultValue(array('http' => array(), 'ssl' => array()))
  214. ->beforeNormalization()
  215. ->ifTrue(function($v) { return !is_array($v); })
  216. ->then(function($v) { return array($v); })
  217. ->end()
  218. ->beforeNormalization()
  219. ->always()
  220. ->then($organizeUrls)
  221. ->end()
  222. ->children()
  223. ->arrayNode('http')
  224. ->prototype('scalar')->end()
  225. ->end()
  226. ->arrayNode('ssl')
  227. ->prototype('scalar')->end()
  228. ->end()
  229. ->end()
  230. ->end()
  231. ->scalarNode('cache')->end()
  232. ->end()
  233. ->fixXmlConfig('engine')
  234. ->children()
  235. ->arrayNode('engines')
  236. ->isRequired()
  237. ->requiresAtLeastOneElement()
  238. ->beforeNormalization()
  239. ->ifTrue(function($v){ return !is_array($v); })
  240. ->then(function($v){ return array($v); })
  241. ->end()
  242. ->prototype('scalar')->end()
  243. ->end()
  244. ->end()
  245. ->fixXmlConfig('loader')
  246. ->children()
  247. ->arrayNode('loaders')
  248. ->beforeNormalization()
  249. ->ifTrue(function($v){ return !is_array($v); })
  250. ->then(function($v){ return array($v); })
  251. ->end()
  252. ->prototype('scalar')->end()
  253. ->end()
  254. ->end()
  255. ->fixXmlConfig('package')
  256. ->children()
  257. ->arrayNode('packages')
  258. ->useAttributeAsKey('name')
  259. ->prototype('array')
  260. ->fixXmlConfig('base_url')
  261. ->children()
  262. ->scalarNode('version')->defaultNull()->end()
  263. ->scalarNode('version_format')->defaultNull()->end()
  264. ->arrayNode('base_urls')
  265. ->addDefaultsIfNotSet()
  266. ->defaultValue(array('http' => array(), 'ssl' => array()))
  267. ->beforeNormalization()
  268. ->ifTrue(function($v) { return !is_array($v); })
  269. ->then(function($v) { return array($v); })
  270. ->end()
  271. ->beforeNormalization()
  272. ->always()
  273. ->then($organizeUrls)
  274. ->end()
  275. ->children()
  276. ->arrayNode('http')
  277. ->prototype('scalar')->end()
  278. ->end()
  279. ->arrayNode('ssl')
  280. ->prototype('scalar')->end()
  281. ->end()
  282. ->end()
  283. ->end()
  284. ->end()
  285. ->end()
  286. ->end()
  287. ->end()
  288. ->end()
  289. ->end()
  290. ;
  291. }
  292. private function addTranslatorSection(ArrayNodeDefinition $rootNode)
  293. {
  294. $rootNode
  295. ->children()
  296. ->arrayNode('translator')
  297. ->canBeUnset()
  298. ->treatNullLike(array('enabled' => true))
  299. ->treatTrueLike(array('enabled' => true))
  300. ->children()
  301. ->booleanNode('enabled')->defaultTrue()->end()
  302. ->scalarNode('fallback')->defaultValue('en')->end()
  303. ->end()
  304. ->end()
  305. ->end()
  306. ;
  307. }
  308. private function addValidationSection(ArrayNodeDefinition $rootNode)
  309. {
  310. $rootNode
  311. ->children()
  312. ->arrayNode('validation')
  313. ->canBeUnset()
  314. ->treatNullLike(array('enabled' => true))
  315. ->treatTrueLike(array('enabled' => true))
  316. ->children()
  317. ->booleanNode('enabled')->defaultTrue()->end()
  318. ->scalarNode('cache')->end()
  319. ->booleanNode('enable_annotations')->defaultFalse()->end()
  320. ->end()
  321. ->end()
  322. ->end()
  323. ;
  324. }
  325. private function addAnnotationsSection(ArrayNodeDefinition $rootNode)
  326. {
  327. $rootNode
  328. ->children()
  329. ->arrayNode('annotations')
  330. ->addDefaultsIfNotSet()
  331. ->children()
  332. ->scalarNode('cache')->defaultValue('file')->end()
  333. ->scalarNode('file_cache_dir')->defaultValue('%kernel.cache_dir%/annotations')->end()
  334. ->booleanNode('debug')->defaultValue($this->debug)->end()
  335. ->end()
  336. ->end()
  337. ->end()
  338. ;
  339. }
  340. }