2010-02-17 13:55:05 +00:00
|
|
|
<?php
|
|
|
|
|
2010-07-09 09:05:26 +01:00
|
|
|
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
|
2010-02-17 13:55:05 +00:00
|
|
|
|
|
|
|
use Symfony\Components\DependencyInjection\Loader\LoaderExtension;
|
|
|
|
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
|
2010-06-27 17:28:29 +01:00
|
|
|
use Symfony\Components\DependencyInjection\Resource\FileResource;
|
2010-02-17 13:55:05 +00:00
|
|
|
use Symfony\Components\DependencyInjection\BuilderConfiguration;
|
|
|
|
use Symfony\Components\DependencyInjection\Reference;
|
2010-06-24 09:40:05 +01:00
|
|
|
use Symfony\Components\DependencyInjection\Definition;
|
2010-02-17 13:55:05 +00:00
|
|
|
|
|
|
|
/*
|
2010-04-07 01:51:29 +01:00
|
|
|
* This file is part of the Symfony framework.
|
2010-02-17 13:55:05 +00:00
|
|
|
*
|
|
|
|
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*
|
|
|
|
* This source file is subject to the MIT license that is bundled
|
|
|
|
* with this source code in the file LICENSE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2010-04-07 01:51:29 +01:00
|
|
|
* WebExtension.
|
2010-02-17 13:55:05 +00:00
|
|
|
*
|
2010-04-07 01:51:29 +01:00
|
|
|
* @package Symfony
|
2010-07-09 09:27:29 +01:00
|
|
|
* @subpackage Bundle_FrameworkBundle
|
2010-02-17 13:55:05 +00:00
|
|
|
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
|
*/
|
|
|
|
class WebExtension extends LoaderExtension
|
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
protected $resources = array(
|
|
|
|
'templating' => 'templating.xml',
|
|
|
|
'web' => 'web.xml',
|
2010-06-24 09:40:05 +01:00
|
|
|
// validation.xml conflicts with the naming convention for XML
|
|
|
|
// validation mapping files, so call it validator.xml
|
|
|
|
'validation' => 'validator.xml',
|
2010-05-06 12:25:53 +01:00
|
|
|
);
|
2010-02-17 13:55:05 +00:00
|
|
|
|
2010-06-24 09:40:05 +01:00
|
|
|
protected $bundleDirs = array();
|
|
|
|
protected $bundles = array();
|
|
|
|
|
|
|
|
public function __construct(array $bundleDirs, array $bundles)
|
|
|
|
{
|
|
|
|
$this->bundleDirs = $bundleDirs;
|
|
|
|
$this->bundles = $bundles;
|
|
|
|
}
|
|
|
|
|
2010-06-07 08:08:35 +01:00
|
|
|
/**
|
|
|
|
* Loads the web configuration.
|
|
|
|
*
|
|
|
|
* @param array $config A configuration array
|
|
|
|
* @param BuilderConfiguration $configuration A BuilderConfiguration instance
|
|
|
|
*
|
|
|
|
* @return BuilderConfiguration A BuilderConfiguration instance
|
|
|
|
*/
|
2010-06-16 13:19:46 +01:00
|
|
|
public function configLoad($config, BuilderConfiguration $configuration)
|
2010-02-24 14:42:04 +00:00
|
|
|
{
|
2010-06-07 08:08:35 +01:00
|
|
|
if (!$configuration->hasDefinition('controller_manager')) {
|
|
|
|
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
|
|
|
|
$configuration->merge($loader->load($this->resources['web']));
|
|
|
|
}
|
2010-02-17 13:55:05 +00:00
|
|
|
|
2010-05-07 15:09:11 +01:00
|
|
|
if (isset($config['ide']) && 'textmate' === $config['ide']) {
|
2010-05-06 12:25:53 +01:00
|
|
|
$configuration->setParameter('debug.file_link_format', 'txmt://open?url=file://%%f&line=%%l');
|
|
|
|
}
|
2010-02-17 13:55:05 +00:00
|
|
|
|
2010-06-16 13:19:46 +01:00
|
|
|
if (isset($config['toolbar']) && $config['toolbar']) {
|
|
|
|
$config['profiler'] = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($config['profiler'])) {
|
|
|
|
if ($config['profiler']) {
|
|
|
|
if (!$configuration->hasDefinition('profiler')) {
|
|
|
|
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
|
2010-06-21 11:12:25 +01:00
|
|
|
$configuration->merge($loader->load('profiling.xml'));
|
2010-06-25 15:40:36 +01:00
|
|
|
$configuration->merge($loader->load('collectors.xml'));
|
2010-06-16 13:19:46 +01:00
|
|
|
}
|
|
|
|
} elseif ($configuration->hasDefinition('profiler')) {
|
|
|
|
$configuration->getDefinition('profiling')->clearAnnotations();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// toolbar need to be registered after the profiler
|
|
|
|
if (isset($config['toolbar'])) {
|
|
|
|
if ($config['toolbar']) {
|
|
|
|
if (!$configuration->hasDefinition('debug.toolbar')) {
|
|
|
|
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
|
|
|
|
$configuration->merge($loader->load('toolbar.xml'));
|
|
|
|
}
|
|
|
|
} elseif ($configuration->hasDefinition('debug.toolbar')) {
|
|
|
|
$configuration->getDefinition('debug.toolbar')->clearAnnotations();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-06-30 22:03:43 +01:00
|
|
|
if (isset($config['validation']['enabled'])) {
|
|
|
|
if ($config['validation']['enabled']) {
|
2010-06-24 09:40:05 +01:00
|
|
|
if (!$configuration->hasDefinition('validator')) {
|
|
|
|
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
|
|
|
|
$configuration->merge($loader->load($this->resources['validation']));
|
|
|
|
}
|
|
|
|
|
|
|
|
$xmlMappingFiles = array();
|
|
|
|
$yamlMappingFiles = array();
|
|
|
|
$messageFiles = array();
|
|
|
|
|
|
|
|
// default entries by the framework
|
|
|
|
$xmlMappingFiles[] = __DIR__.'/../../../Components/Form/Resources/config/validation.xml';
|
|
|
|
$messageFiles[] = __DIR__ . '/../../../Components/Validator/Resources/i18n/messages.en.xml';
|
|
|
|
$messageFiles[] = __DIR__ . '/../../../Components/Form/Resources/i18n/messages.en.xml';
|
|
|
|
|
|
|
|
foreach ($this->bundles as $className) {
|
|
|
|
$tmp = dirname(str_replace('\\', '/', $className));
|
|
|
|
$namespace = str_replace('/', '\\', dirname($tmp));
|
|
|
|
$bundle = basename($tmp);
|
|
|
|
|
|
|
|
foreach ($this->bundleDirs as $dir) {
|
|
|
|
if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.xml')) {
|
|
|
|
$xmlMappingFiles[] = realpath($file);
|
|
|
|
}
|
|
|
|
if (file_exists($file = $dir.'/'.$bundle.'/Resources/config/validation.yml')) {
|
|
|
|
$yamlMappingFiles[] = realpath($file);
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO do we really want the message files of all cultures?
|
|
|
|
foreach (glob($dir.'/'.$bundle.'/Resources/i18n/messages.*.xml') as $file) {
|
|
|
|
$messageFiles[] = realpath($file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$xmlFilesLoader = new Definition(
|
|
|
|
$configuration->getParameter('validator.mapping.loader.xml_files_loader.class'),
|
|
|
|
array($xmlMappingFiles)
|
|
|
|
);
|
|
|
|
|
|
|
|
$yamlFilesLoader = new Definition(
|
|
|
|
$configuration->getParameter('validator.mapping.loader.yaml_files_loader.class'),
|
|
|
|
array($yamlMappingFiles)
|
|
|
|
);
|
|
|
|
|
|
|
|
$configuration->setDefinition('validator.mapping.loader.xml_files_loader', $xmlFilesLoader);
|
|
|
|
$configuration->setDefinition('validator.mapping.loader.yaml_files_loader', $yamlFilesLoader);
|
|
|
|
$configuration->setParameter('validator.message_interpolator.files', $messageFiles);
|
|
|
|
|
|
|
|
foreach ($xmlMappingFiles as $file) {
|
|
|
|
$configuration->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($yamlMappingFiles as $file) {
|
|
|
|
$configuration->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($messageFiles as $file) {
|
|
|
|
$configuration->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isset($config['validation']['annotations']) && $config['validation']['annotations'] === true) {
|
|
|
|
$annotationLoader = new Definition($configuration->getParameter('validator.mapping.loader.annotation_loader.class'));
|
|
|
|
$configuration->setDefinition('validator.mapping.loader.annotation_loader', $annotationLoader);
|
|
|
|
|
|
|
|
$loader = $configuration->getDefinition('validator.mapping.loader.loader_chain');
|
|
|
|
$arguments = $loader->getArguments();
|
2010-06-30 22:03:43 +01:00
|
|
|
array_unshift($arguments[0], new Reference('validator.mapping.loader.annotation_loader'));
|
2010-06-24 09:40:05 +01:00
|
|
|
$loader->setArguments($arguments);
|
|
|
|
}
|
|
|
|
} elseif ($configuration->hasDefinition('validator')) {
|
|
|
|
$configuration->getDefinition('validator')->clearAnnotations();
|
|
|
|
}
|
|
|
|
}
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Loads the templating configuration.
|
|
|
|
*
|
|
|
|
* @param array $config A configuration array
|
|
|
|
*
|
|
|
|
* @return BuilderConfiguration A BuilderConfiguration instance
|
|
|
|
*/
|
2010-06-07 08:08:35 +01:00
|
|
|
public function templatingLoad($config, BuilderConfiguration $configuration)
|
2010-02-17 13:55:05 +00:00
|
|
|
{
|
2010-06-07 08:08:35 +01:00
|
|
|
if (!$configuration->hasDefinition('templating')) {
|
|
|
|
$loader = new XmlFileLoader(__DIR__.'/../Resources/config');
|
|
|
|
$configuration->merge($loader->load($this->resources['templating']));
|
|
|
|
}
|
2010-05-06 12:25:53 +01:00
|
|
|
|
2010-06-07 08:08:35 +01:00
|
|
|
if (array_key_exists('escaping', $config)) {
|
|
|
|
$configuration->setParameter('templating.output_escaper', $config['escaping']);
|
|
|
|
}
|
2010-05-06 12:25:53 +01:00
|
|
|
|
2010-06-07 08:08:35 +01:00
|
|
|
if (array_key_exists('assets_version', $config)) {
|
|
|
|
$configuration->setParameter('templating.assets.version', $config['assets_version']);
|
|
|
|
}
|
2010-05-06 12:25:53 +01:00
|
|
|
|
|
|
|
// path for the filesystem loader
|
2010-05-07 15:09:11 +01:00
|
|
|
if (isset($config['path'])) {
|
2010-05-06 12:25:53 +01:00
|
|
|
$configuration->setParameter('templating.loader.filesystem.path', $config['path']);
|
|
|
|
}
|
|
|
|
|
|
|
|
// loaders
|
2010-05-07 15:09:11 +01:00
|
|
|
if (isset($config['loader'])) {
|
2010-05-06 12:25:53 +01:00
|
|
|
$loaders = array();
|
|
|
|
$ids = is_array($config['loader']) ? $config['loader'] : array($config['loader']);
|
2010-05-07 15:09:11 +01:00
|
|
|
foreach ($ids as $id) {
|
2010-05-06 12:25:53 +01:00
|
|
|
$loaders[] = new Reference($id);
|
|
|
|
}
|
|
|
|
|
2010-06-07 08:08:35 +01:00
|
|
|
if (1 === count($loaders)) {
|
|
|
|
$configuration->setAlias('templating.loader', (string) $loaders[0]);
|
|
|
|
} else {
|
|
|
|
$configuration->getDefinition('templating.loader.chain')->addArgument($loaders);
|
|
|
|
$configuration->setAlias('templating.loader', 'templating.loader.chain');
|
|
|
|
}
|
2010-05-06 12:25:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// cache?
|
2010-06-27 17:28:29 +01:00
|
|
|
$configuration->setParameter('templating.loader.cache.path', null);
|
2010-05-07 15:09:11 +01:00
|
|
|
if (isset($config['cache'])) {
|
2010-05-06 12:25:53 +01:00
|
|
|
// wrap the loader with some cache
|
|
|
|
$configuration->setDefinition('templating.loader.wrapped', $configuration->findDefinition('templating.loader'));
|
|
|
|
$configuration->setDefinition('templating.loader', $configuration->getDefinition('templating.loader.cache'));
|
|
|
|
$configuration->setParameter('templating.loader.cache.path', $config['cache']);
|
|
|
|
}
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
/**
|
|
|
|
* Returns the base path for the XSD files.
|
|
|
|
*
|
|
|
|
* @return string The XSD base path
|
|
|
|
*/
|
|
|
|
public function getXsdValidationBasePath()
|
2010-02-17 13:55:05 +00:00
|
|
|
{
|
2010-06-27 17:54:03 +01:00
|
|
|
return __DIR__.'/../Resources/config/schema';
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
public function getNamespace()
|
2010-02-17 13:55:05 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
return 'http://www.symfony-project.org/schema/dic/symfony';
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
|
2010-05-06 12:25:53 +01:00
|
|
|
public function getAlias()
|
2010-02-17 13:55:05 +00:00
|
|
|
{
|
2010-05-06 12:25:53 +01:00
|
|
|
return 'web';
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
}
|