WebExtension.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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 A configuration array
  44. * @param BuilderConfiguration $configuration A BuilderConfiguration instance
  45. *
  46. * @return BuilderConfiguration A BuilderConfiguration instance
  47. */
  48. public function configLoad($config, BuilderConfiguration $configuration)
  49. {
  50. if (!$configuration->hasDefinition('controller_manager')) {
  51. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  52. $configuration->merge($loader->load($this->resources['web']));
  53. }
  54. if (isset($config['ide']) && 'textmate' === $config['ide']) {
  55. $configuration->setParameter('debug.file_link_format', 'txmt://open?url=file://%%f&line=%%l');
  56. }
  57. if (isset($config['toolbar']) && $config['toolbar']) {
  58. $config['profiler'] = true;
  59. }
  60. if (isset($config['profiler'])) {
  61. if ($config['profiler']) {
  62. if (!$configuration->hasDefinition('profiler')) {
  63. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  64. $configuration->merge($loader->load('profiling.xml'));
  65. $configuration->merge($loader->load('collectors.xml'));
  66. }
  67. } elseif ($configuration->hasDefinition('profiler')) {
  68. $configuration->getDefinition('profiling')->clearAnnotations();
  69. }
  70. }
  71. // toolbar need to be registered after the profiler
  72. if (isset($config['toolbar'])) {
  73. if ($config['toolbar']) {
  74. if (!$configuration->hasDefinition('debug.toolbar')) {
  75. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  76. $configuration->merge($loader->load('toolbar.xml'));
  77. }
  78. } elseif ($configuration->hasDefinition('debug.toolbar')) {
  79. $configuration->getDefinition('debug.toolbar')->clearAnnotations();
  80. }
  81. }
  82. if (isset($config['validation']['enabled'])) {
  83. if ($config['validation']['enabled']) {
  84. if (!$configuration->hasDefinition('validator')) {
  85. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  86. $configuration->merge($loader->load($this->resources['validation']));
  87. }
  88. $xmlMappingFiles = array();
  89. $yamlMappingFiles = array();
  90. $messageFiles = array();
  91. // default entries by the framework
  92. $xmlMappingFiles[] = __DIR__.'/../../../Components/Form/Resources/config/validation.xml';
  93. $messageFiles[] = __DIR__ . '/../../../Components/Validator/Resources/i18n/messages.en.xml';
  94. $messageFiles[] = __DIR__ . '/../../../Components/Form/Resources/i18n/messages.en.xml';
  95. foreach ($this->bundles as $className) {
  96. $tmp = dirname(str_replace('\\', '/', $className));
  97. $namespace = str_replace('/', '\\', dirname($tmp));
  98. $bundle = basename($tmp);
  99. foreach ($this->bundleDirs as $dir) {
  100. if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.xml')) {
  101. $xmlMappingFiles[] = realpath($file);
  102. }
  103. if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.yml')) {
  104. $yamlMappingFiles[] = realpath($file);
  105. }
  106. // TODO do we really want the message files of all cultures?
  107. foreach (glob($dir.'/'.$bundle.'/Resources/i18n/messages.*.xml') as $file) {
  108. $messageFiles[] = realpath($file);
  109. }
  110. }
  111. }
  112. $xmlFilesLoader = new Definition(
  113. $configuration->getParameter('validator.mapping.loader.xml_files_loader.class'),
  114. array($xmlMappingFiles)
  115. );
  116. $yamlFilesLoader = new Definition(
  117. $configuration->getParameter('validator.mapping.loader.yaml_files_loader.class'),
  118. array($yamlMappingFiles)
  119. );
  120. $configuration->setDefinition('validator.mapping.loader.xml_files_loader', $xmlFilesLoader);
  121. $configuration->setDefinition('validator.mapping.loader.yaml_files_loader', $yamlFilesLoader);
  122. $configuration->setParameter('validator.message_interpolator.files', $messageFiles);
  123. foreach ($xmlMappingFiles as $file) {
  124. $configuration->addResource(new FileResource($file));
  125. }
  126. foreach ($yamlMappingFiles as $file) {
  127. $configuration->addResource(new FileResource($file));
  128. }
  129. foreach ($messageFiles as $file) {
  130. $configuration->addResource(new FileResource($file));
  131. }
  132. if (isset($config['validation']['annotations']) && $config['validation']['annotations'] === true) {
  133. $annotationLoader = new Definition($configuration->getParameter('validator.mapping.loader.annotation_loader.class'));
  134. $configuration->setDefinition('validator.mapping.loader.annotation_loader', $annotationLoader);
  135. $loader = $configuration->getDefinition('validator.mapping.loader.loader_chain');
  136. $arguments = $loader->getArguments();
  137. array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader'));
  138. $loader->setArguments($arguments);
  139. }
  140. } elseif ($configuration->hasDefinition('validator')) {
  141. $configuration->getDefinition('validator')->clearAnnotations();
  142. }
  143. }
  144. }
  145. /**
  146. * Loads the templating configuration.
  147. *
  148. * @param array $config A configuration array
  149. *
  150. * @return BuilderConfiguration A BuilderConfiguration instance
  151. */
  152. public function templatingLoad($config, BuilderConfiguration $configuration)
  153. {
  154. if (!$configuration->hasDefinition('templating')) {
  155. $loader = new XmlFileLoader(__DIR__.'/../Resources/config');
  156. $configuration->merge($loader->load($this->resources['templating']));
  157. }
  158. if (array_key_exists('escaping', $config)) {
  159. $configuration->setParameter('templating.output_escaper', $config['escaping']);
  160. }
  161. if (array_key_exists('assets_version', $config)) {
  162. $configuration->setParameter('templating.assets.version', $config['assets_version']);
  163. }
  164. // path for the filesystem loader
  165. if (isset($config['path'])) {
  166. $configuration->setParameter('templating.loader.filesystem.path', $config['path']);
  167. }
  168. // loaders
  169. if (isset($config['loader'])) {
  170. $loaders = array();
  171. $ids = is_array($config['loader']) ? $config['loader'] : array($config['loader']);
  172. foreach ($ids as $id) {
  173. $loaders[] = new Reference($id);
  174. }
  175. if (1 === count($loaders)) {
  176. $configuration->setAlias('templating.loader', (string) $loaders[0]);
  177. } else {
  178. $configuration->getDefinition('templating.loader.chain')->addArgument($loaders);
  179. $configuration->setAlias('templating.loader', 'templating.loader.chain');
  180. }
  181. }
  182. // cache?
  183. $configuration->setParameter('templating.loader.cache.path', null);
  184. if (isset($config['cache'])) {
  185. // wrap the loader with some cache
  186. $configuration->setDefinition('templating.loader.wrapped', $configuration->findDefinition('templating.loader'));
  187. $configuration->setDefinition('templating.loader', $configuration->getDefinition('templating.loader.cache'));
  188. $configuration->setParameter('templating.loader.cache.path', $config['cache']);
  189. }
  190. }
  191. /**
  192. * Returns the base path for the XSD files.
  193. *
  194. * @return string The XSD base path
  195. */
  196. public function getXsdValidationBasePath()
  197. {
  198. return __DIR__.'/../Resources/config/schema';
  199. }
  200. public function getNamespace()
  201. {
  202. return 'http://www.symfony-project.org/schema/dic/symfony';
  203. }
  204. public function getAlias()
  205. {
  206. return 'web';
  207. }
  208. }