WebExtension.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?php
  2. namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
  3. use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
  4. use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
  5. use Symfony\Components\DependencyInjection\Resource\FileResource;
  6. use Symfony\Components\DependencyInjection\BuilderConfiguration;
  7. use Symfony\Components\DependencyInjection\Reference;
  8. use Symfony\Components\DependencyInjection\Definition;
  9. /*
  10. * This file is part of the Symfony framework.
  11. *
  12. * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
  13. *
  14. * This source file is subject to the MIT license that is bundled
  15. * with this source code in the file LICENSE.
  16. */
  17. /**
  18. * WebExtension.
  19. *
  20. * @package Symfony
  21. * @subpackage Bundle_FrameworkBundle
  22. * @author Fabien Potencier <fabien.potencier@symfony-project.com>
  23. */
  24. class WebExtension extends LoaderExtension
  25. {
  26. protected $resources = array(
  27. 'templating' => 'templating.xml',
  28. 'web' => 'web.xml',
  29. // validation.xml conflicts with the naming convention for XML
  30. // validation mapping files, so call it validator.xml
  31. 'validation' => 'validator.xml',
  32. );
  33. protected $bundleDirs = array();
  34. protected $bundles = array();
  35. public function __construct(array $bundleDirs, array $bundles)
  36. {
  37. $this->bundleDirs = $bundleDirs;
  38. $this->bundles = $bundles;
  39. }
  40. /**
  41. * Loads the web configuration.
  42. *
  43. * @param array $config An array of configuration settings
  44. * @param \Symfony\Components\DependencyInjection\BuilderConfiguration $configuration A BuilderConfiguration instance
  45. */
  46. public function configLoad($config, BuilderConfiguration $configuration)
  47. {
  48. if (!$configuration->hasDefinition('controller_manager')) {
  49. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  50. $configuration->merge($loader->load($this->resources['web']));
  51. }
  52. if (isset($config['ide']) && 'textmate' === $config['ide']) {
  53. $configuration->setParameter('debug.file_link_format', 'txmt://open?url=file://%%f&line=%%l');
  54. }
  55. if (isset($config['toolbar']) && $config['toolbar']) {
  56. $config['profiler'] = true;
  57. }
  58. if (isset($config['profiler'])) {
  59. if ($config['profiler']) {
  60. if (!$configuration->hasDefinition('profiler')) {
  61. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  62. $configuration->merge($loader->load('profiling.xml'));
  63. $configuration->merge($loader->load('collectors.xml'));
  64. }
  65. } elseif ($configuration->hasDefinition('profiler')) {
  66. $configuration->getDefinition('profiling')->clearAnnotations();
  67. }
  68. }
  69. // toolbar need to be registered after the profiler
  70. if (isset($config['toolbar'])) {
  71. if ($config['toolbar']) {
  72. if (!$configuration->hasDefinition('debug.toolbar')) {
  73. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  74. $configuration->merge($loader->load('toolbar.xml'));
  75. }
  76. } elseif ($configuration->hasDefinition('debug.toolbar')) {
  77. $configuration->getDefinition('debug.toolbar')->clearAnnotations();
  78. }
  79. }
  80. if (isset($config['validation']['enabled'])) {
  81. if ($config['validation']['enabled']) {
  82. if (!$configuration->hasDefinition('validator')) {
  83. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  84. $configuration->merge($loader->load($this->resources['validation']));
  85. }
  86. $xmlMappingFiles = array();
  87. $yamlMappingFiles = array();
  88. $messageFiles = array();
  89. // default entries by the framework
  90. $xmlMappingFiles[] = __DIR__.'/../../../Components/Form/Resources/config/validation.xml';
  91. $messageFiles[] = __DIR__ . '/../../../Components/Validator/Resources/i18n/messages.en.xml';
  92. $messageFiles[] = __DIR__ . '/../../../Components/Form/Resources/i18n/messages.en.xml';
  93. foreach ($this->bundles as $className) {
  94. $tmp = dirname(str_replace('\\', '/', $className));
  95. $namespace = str_replace('/', '\\', dirname($tmp));
  96. $bundle = basename($tmp);
  97. foreach ($this->bundleDirs as $dir) {
  98. if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.xml')) {
  99. $xmlMappingFiles[] = realpath($file);
  100. }
  101. if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.yml')) {
  102. $yamlMappingFiles[] = realpath($file);
  103. }
  104. // TODO do we really want the message files of all cultures?
  105. foreach (glob($dir.'/'.$bundle.'/Resources/i18n/messages.*.xml') as $file) {
  106. $messageFiles[] = realpath($file);
  107. }
  108. }
  109. }
  110. $xmlFilesLoader = new Definition(
  111. $configuration->getParameter('validator.mapping.loader.xml_files_loader.class'),
  112. array($xmlMappingFiles)
  113. );
  114. $yamlFilesLoader = new Definition(
  115. $configuration->getParameter('validator.mapping.loader.yaml_files_loader.class'),
  116. array($yamlMappingFiles)
  117. );
  118. $configuration->setDefinition('validator.mapping.loader.xml_files_loader', $xmlFilesLoader);
  119. $configuration->setDefinition('validator.mapping.loader.yaml_files_loader', $yamlFilesLoader);
  120. $configuration->setParameter('validator.message_interpolator.files', $messageFiles);
  121. foreach ($xmlMappingFiles as $file) {
  122. $configuration->addResource(new FileResource($file));
  123. }
  124. foreach ($yamlMappingFiles as $file) {
  125. $configuration->addResource(new FileResource($file));
  126. }
  127. foreach ($messageFiles as $file) {
  128. $configuration->addResource(new FileResource($file));
  129. }
  130. if (isset($config['validation']['annotations']) && $config['validation']['annotations'] === true) {
  131. $annotationLoader = new Definition($configuration->getParameter('validator.mapping.loader.annotation_loader.class'));
  132. $configuration->setDefinition('validator.mapping.loader.annotation_loader', $annotationLoader);
  133. $loader = $configuration->getDefinition('validator.mapping.loader.loader_chain');
  134. $arguments = $loader->getArguments();
  135. array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader'));
  136. $loader->setArguments($arguments);
  137. }
  138. } elseif ($configuration->hasDefinition('validator')) {
  139. $configuration->getDefinition('validator')->clearAnnotations();
  140. }
  141. }
  142. }
  143. /**
  144. * Loads the templating configuration.
  145. *
  146. * @param array $config An array of configuration settings
  147. * @param \Symfony\Components\DependencyInjection\BuilderConfiguration $configuration A BuilderConfiguration instance
  148. */
  149. public function templatingLoad($config, BuilderConfiguration $configuration)
  150. {
  151. if (!$configuration->hasDefinition('templating')) {
  152. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  153. $configuration->merge($loader->load($this->resources['templating']));
  154. }
  155. if (array_key_exists('escaping', $config)) {
  156. $configuration->setParameter('templating.output_escaper', $config['escaping']);
  157. }
  158. if (array_key_exists('assets_version', $config)) {
  159. $configuration->setParameter('templating.assets.version', $config['assets_version']);
  160. }
  161. // path for the filesystem loader
  162. if (isset($config['path'])) {
  163. $configuration->setParameter('templating.loader.filesystem.path', $config['path']);
  164. }
  165. // loaders
  166. if (isset($config['loader'])) {
  167. $loaders = array();
  168. $ids = is_array($config['loader']) ? $config['loader'] : array($config['loader']);
  169. foreach ($ids as $id) {
  170. $loaders[] = new Reference($id);
  171. }
  172. if (1 === count($loaders)) {
  173. $configuration->setAlias('templating.loader', (string) $loaders[0]);
  174. } else {
  175. $configuration->getDefinition('templating.loader.chain')->addArgument($loaders);
  176. $configuration->setAlias('templating.loader', 'templating.loader.chain');
  177. }
  178. }
  179. // cache?
  180. $configuration->setParameter('templating.loader.cache.path', null);
  181. if (isset($config['cache'])) {
  182. // wrap the loader with some cache
  183. $configuration->setDefinition('templating.loader.wrapped', $configuration->findDefinition('templating.loader'));
  184. $configuration->setDefinition('templating.loader', $configuration->getDefinition('templating.loader.cache'));
  185. $configuration->setParameter('templating.loader.cache.path', $config['cache']);
  186. }
  187. }
  188. /**
  189. * Returns the base path for the XSD files.
  190. *
  191. * @return string The XSD base path
  192. */
  193. public function getXsdValidationBasePath()
  194. {
  195. return __DIR__.'/../Resources/config/schema';
  196. }
  197. public function getNamespace()
  198. {
  199. return 'http://www.symfony-project.org/schema/dic/symfony';
  200. }
  201. public function getAlias()
  202. {
  203. return 'web';
  204. }
  205. }