2010-02-17 13:55:05 +00:00
|
|
|
<?php
|
|
|
|
|
2011-01-15 13:29:43 +00:00
|
|
|
/*
|
|
|
|
* This file is part of the Symfony package.
|
|
|
|
*
|
2011-03-06 11:40:06 +00:00
|
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
2011-01-15 13:29:43 +00:00
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
2010-07-09 09:05:26 +01:00
|
|
|
namespace Symfony\Bundle\FrameworkBundle\DependencyInjection;
|
2010-02-17 13:55:05 +00:00
|
|
|
|
2010-08-20 22:09:55 +01:00
|
|
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
2013-09-04 16:33:26 +01:00
|
|
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
2014-12-25 03:17:33 +00:00
|
|
|
use Symfony\Component\DependencyInjection\Definition;
|
2011-05-21 00:08:03 +01:00
|
|
|
use Symfony\Component\DependencyInjection\DefinitionDecorator;
|
2014-09-03 13:55:20 +01:00
|
|
|
use Symfony\Component\DependencyInjection\Exception\LogicException;
|
2011-01-24 19:50:31 +00:00
|
|
|
use Symfony\Component\DependencyInjection\Reference;
|
|
|
|
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
|
2011-02-10 15:15:51 +00:00
|
|
|
use Symfony\Component\Config\Resource\FileResource;
|
2012-04-20 14:14:14 +01:00
|
|
|
use Symfony\Component\Config\Resource\DirectoryResource;
|
2010-09-27 08:46:15 +01:00
|
|
|
use Symfony\Component\Finder\Finder;
|
2011-01-16 09:17:38 +00:00
|
|
|
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
2011-02-10 15:15:51 +00:00
|
|
|
use Symfony\Component\Config\FileLocator;
|
2014-03-18 16:36:12 +00:00
|
|
|
use Symfony\Component\Validator\Validation;
|
2010-02-17 13:55:05 +00:00
|
|
|
|
|
|
|
/**
|
2010-09-20 20:01:41 +01:00
|
|
|
* FrameworkExtension.
|
2010-02-17 13:55:05 +00:00
|
|
|
*
|
2011-03-06 11:40:06 +00:00
|
|
|
* @author Fabien Potencier <fabien@symfony.com>
|
2011-01-24 19:50:31 +00:00
|
|
|
* @author Jeremy Mikola <jmikola@gmail.com>
|
2014-12-25 03:17:33 +00:00
|
|
|
* @author Kévin Dunglas <dunglas@gmail.com>
|
2010-02-17 13:55:05 +00:00
|
|
|
*/
|
2010-09-20 20:01:41 +01:00
|
|
|
class FrameworkExtension extends Extension
|
2010-02-17 13:55:05 +00:00
|
|
|
{
|
2013-09-26 14:56:56 +01:00
|
|
|
private $formConfigEnabled = false;
|
2015-03-20 23:12:36 +00:00
|
|
|
private $translationConfigEnabled = false;
|
2013-10-09 09:42:58 +01:00
|
|
|
private $sessionConfigEnabled = false;
|
2013-09-26 14:56:56 +01:00
|
|
|
|
2015-12-10 10:46:31 +00:00
|
|
|
/**
|
|
|
|
* @var string|null
|
|
|
|
*/
|
|
|
|
private $kernelRootHash;
|
|
|
|
|
2010-06-07 08:08:35 +01:00
|
|
|
/**
|
2011-01-24 19:50:31 +00:00
|
|
|
* Responds to the app.config configuration parameter.
|
2010-06-07 08:08:35 +01:00
|
|
|
*
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param array $configs
|
|
|
|
* @param ContainerBuilder $container
|
2015-03-10 21:45:35 +00:00
|
|
|
*
|
2014-12-25 10:36:58 +00:00
|
|
|
* @throws LogicException
|
2010-06-07 08:08:35 +01:00
|
|
|
*/
|
2011-02-15 04:58:18 +00:00
|
|
|
public function load(array $configs, ContainerBuilder $container)
|
2010-02-24 14:42:04 +00:00
|
|
|
{
|
2011-02-09 23:44:02 +00:00
|
|
|
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
|
2010-07-17 16:40:38 +01:00
|
|
|
|
2011-01-24 19:50:31 +00:00
|
|
|
$loader->load('web.xml');
|
|
|
|
$loader->load('services.xml');
|
2013-01-31 09:37:27 +00:00
|
|
|
$loader->load('fragment_renderer.xml');
|
2010-10-25 15:55:20 +01:00
|
|
|
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
// A translator must always be registered (as support is included by
|
|
|
|
// default in the Form component). If disabled, an identity translator
|
|
|
|
// will be used and everything will still work as expected.
|
|
|
|
$loader->load('translation.xml');
|
|
|
|
|
2013-09-10 16:14:04 +01:00
|
|
|
// Property access is used by both the Form and the Validator component
|
|
|
|
$loader->load('property_access.xml');
|
|
|
|
|
2011-05-21 19:33:02 +01:00
|
|
|
$configuration = $this->getConfiguration($configs, $container);
|
2011-07-18 16:46:00 +01:00
|
|
|
$config = $this->processConfiguration($configuration, $configs);
|
2010-09-15 19:49:16 +01:00
|
|
|
|
2012-09-29 19:56:08 +01:00
|
|
|
if (isset($config['secret'])) {
|
|
|
|
$container->setParameter('kernel.secret', $config['secret']);
|
|
|
|
}
|
2011-02-06 20:29:13 +00:00
|
|
|
|
2013-02-27 13:12:14 +00:00
|
|
|
$container->setParameter('kernel.http_method_override', $config['http_method_override']);
|
2013-08-06 08:14:49 +01:00
|
|
|
$container->setParameter('kernel.trusted_hosts', $config['trusted_hosts']);
|
2012-12-06 12:06:01 +00:00
|
|
|
$container->setParameter('kernel.trusted_proxies', $config['trusted_proxies']);
|
2011-10-05 10:09:51 +01:00
|
|
|
$container->setParameter('kernel.default_locale', $config['default_locale']);
|
|
|
|
|
2011-02-10 20:40:00 +00:00
|
|
|
if (!empty($config['test'])) {
|
2011-01-24 19:50:31 +00:00
|
|
|
$loader->load('test.xml');
|
2011-01-24 10:16:22 +00:00
|
|
|
}
|
|
|
|
|
2011-05-18 12:14:51 +01:00
|
|
|
if (isset($config['session'])) {
|
2013-10-09 09:42:58 +01:00
|
|
|
$this->sessionConfigEnabled = true;
|
2011-05-18 12:14:51 +01:00
|
|
|
$this->registerSessionConfiguration($config['session'], $container, $loader);
|
|
|
|
}
|
|
|
|
|
2013-12-25 21:24:54 +00:00
|
|
|
if (isset($config['request'])) {
|
|
|
|
$this->registerRequestConfiguration($config['request'], $container, $loader);
|
|
|
|
}
|
|
|
|
|
2013-10-09 09:42:58 +01:00
|
|
|
$loader->load('security.xml');
|
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
if ($this->isConfigEnabled($container, $config['form'])) {
|
2013-09-26 14:56:56 +01:00
|
|
|
$this->formConfigEnabled = true;
|
2011-05-18 12:14:51 +01:00
|
|
|
$this->registerFormConfiguration($config, $container, $loader);
|
|
|
|
$config['validation']['enabled'] = true;
|
2013-11-30 10:58:54 +00:00
|
|
|
|
2015-01-08 16:22:13 +00:00
|
|
|
if (!class_exists('Symfony\Component\Validator\Validation')) {
|
2014-09-03 13:55:20 +01:00
|
|
|
throw new LogicException('The Validator component is required to use the Form component.');
|
|
|
|
}
|
|
|
|
|
2013-11-30 10:58:54 +00:00
|
|
|
if ($this->isConfigEnabled($container, $config['form']['csrf_protection'])) {
|
|
|
|
$config['csrf_protection']['enabled'] = true;
|
|
|
|
}
|
2011-05-18 12:14:51 +01:00
|
|
|
}
|
|
|
|
|
2013-11-30 10:58:54 +00:00
|
|
|
$this->registerSecurityCsrfConfiguration($config['csrf_protection'], $container, $loader);
|
|
|
|
|
2014-12-28 18:57:17 +00:00
|
|
|
if (isset($config['assets'])) {
|
|
|
|
$this->registerAssetsConfiguration($config['assets'], $container, $loader);
|
|
|
|
}
|
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
if (isset($config['templating'])) {
|
|
|
|
$this->registerTemplatingConfiguration($config['templating'], $config['ide'], $container, $loader);
|
2013-01-22 09:24:26 +00:00
|
|
|
}
|
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
$this->registerValidationConfiguration($config['validation'], $container, $loader);
|
|
|
|
$this->registerEsiConfiguration($config['esi'], $container, $loader);
|
2014-03-23 00:04:57 +00:00
|
|
|
$this->registerSsiConfiguration($config['ssi'], $container, $loader);
|
2013-01-31 09:37:27 +00:00
|
|
|
$this->registerFragmentsConfiguration($config['fragments'], $container, $loader);
|
2013-01-23 14:18:20 +00:00
|
|
|
$this->registerTranslatorConfiguration($config['translator'], $container);
|
2015-03-20 23:12:36 +00:00
|
|
|
$this->registerProfilerConfiguration($config['profiler'], $container, $loader);
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
|
|
|
|
if (isset($config['router'])) {
|
|
|
|
$this->registerRouterConfiguration($config['router'], $container, $loader);
|
|
|
|
}
|
|
|
|
|
2011-05-03 13:36:42 +01:00
|
|
|
$this->registerAnnotationsConfiguration($config['annotations'], $container, $loader);
|
2014-08-21 18:05:54 +01:00
|
|
|
$this->registerPropertyAccessConfiguration($config['property_access'], $container);
|
|
|
|
|
2014-12-25 03:17:33 +00:00
|
|
|
if (isset($config['serializer'])) {
|
|
|
|
$this->registerSerializerConfiguration($config['serializer'], $container, $loader);
|
2013-01-20 18:39:49 +00:00
|
|
|
}
|
|
|
|
|
2014-09-25 18:46:28 +01:00
|
|
|
$loader->load('debug_prod.xml');
|
|
|
|
$definition = $container->findDefinition('debug.debug_handlers_listener');
|
|
|
|
|
|
|
|
if ($container->hasParameter('templating.helper.code.file_link_format')) {
|
2014-09-30 08:39:40 +01:00
|
|
|
$definition->replaceArgument(5, '%templating.helper.code.file_link_format%');
|
2014-09-25 18:46:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
if ($container->getParameter('kernel.debug')) {
|
2015-12-31 16:39:50 +00:00
|
|
|
$definition->replaceArgument(2, -1 & ~(E_COMPILE_ERROR | E_PARSE | E_ERROR | E_CORE_ERROR | E_RECOVERABLE_ERROR));
|
|
|
|
|
2014-09-25 18:46:28 +01:00
|
|
|
$loader->load('debug.xml');
|
|
|
|
|
|
|
|
$definition = $container->findDefinition('http_kernel');
|
|
|
|
$definition->replaceArgument(2, new Reference('debug.controller_resolver'));
|
|
|
|
|
|
|
|
// replace the regular event_dispatcher service with the debug one
|
|
|
|
$definition = $container->findDefinition('event_dispatcher');
|
|
|
|
$definition->setPublic(false);
|
|
|
|
$container->setDefinition('debug.event_dispatcher.parent', $definition);
|
|
|
|
$container->setAlias('event_dispatcher', 'debug.event_dispatcher');
|
|
|
|
} else {
|
2015-12-31 16:39:50 +00:00
|
|
|
$definition->replaceArgument(1, null);
|
2014-09-25 18:46:28 +01:00
|
|
|
}
|
|
|
|
|
2011-01-16 09:17:38 +00:00
|
|
|
$this->addClassesToCompile(array(
|
2011-07-21 21:32:50 +01:00
|
|
|
'Symfony\\Component\\Config\\FileLocator',
|
|
|
|
|
2014-09-27 08:00:54 +01:00
|
|
|
'Symfony\\Component\\Debug\\ErrorHandler',
|
|
|
|
|
2011-03-18 08:24:07 +00:00
|
|
|
'Symfony\\Component\\EventDispatcher\\Event',
|
2012-04-02 16:48:37 +01:00
|
|
|
'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher',
|
2011-03-18 08:24:07 +00:00
|
|
|
|
2011-05-31 09:09:25 +01:00
|
|
|
'Symfony\\Component\\HttpKernel\\EventListener\\ResponseListener',
|
2011-10-10 13:41:48 +01:00
|
|
|
'Symfony\\Component\\HttpKernel\\EventListener\\RouterListener',
|
2010-08-20 22:09:55 +01:00
|
|
|
'Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver',
|
2011-03-13 18:16:56 +00:00
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\KernelEvent',
|
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\FilterControllerEvent',
|
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\FilterResponseEvent',
|
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent',
|
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\GetResponseForControllerResultEvent',
|
|
|
|
'Symfony\\Component\\HttpKernel\\Event\\GetResponseForExceptionEvent',
|
2011-06-21 15:34:33 +01:00
|
|
|
'Symfony\\Component\\HttpKernel\\KernelEvents',
|
2011-07-21 21:32:50 +01:00
|
|
|
'Symfony\\Component\\HttpKernel\\Config\\FileLocator',
|
2010-08-10 20:44:04 +01:00
|
|
|
|
refactored bundle management
Before I explain the changes, let's talk about the current state.
Before this patch, the registerBundleDirs() method returned an ordered (for
resource overloading) list of namespace prefixes and the path to their
location. Here are some problems with this approach:
* The paths set by this method and the paths configured for the autoloader
can be disconnected (leading to unexpected behaviors);
* A bundle outside these paths worked, but unexpected behavior can occur;
* Choosing a bundle namespace was limited to the registered namespace
prefixes, and their number should stay low enough (for performance reasons)
-- moreover the current Bundle\ and Application\ top namespaces does not
respect the standard rules for namespaces (first segment should be the
vendor name);
* Developers must understand the concept of "namespace prefixes" to
understand the overloading mechanism, which is one more thing to learn,
which is Symfony specific;
* Each time you want to get a resource that can be overloaded (a template for
instance), Symfony would have tried all namespace prefixes one after the
other until if finds a matching file. But that can be computed in advance
to reduce the overhead.
Another topic which was not really well addressed is how you can reference a
file/resource from a bundle (and take into account the possibility of
overloading). For instance, in the routing, you can import a file from a
bundle like this:
<import resource="FrameworkBundle/Resources/config/internal.xml" />
Again, this works only because we have a limited number of possible namespace
prefixes.
This patch addresses these problems and some more.
First, the registerBundleDirs() method has been removed. It means that you are
now free to use any namespace for your bundles. No need to have specific
prefixes anymore. You are also free to store them anywhere, in as many
directories as you want. You just need to be sure that they are autoloaded
correctly.
The bundle "name" is now always the short name of the bundle class (like
FrameworkBundle or SensioCasBundle). As the best practice is to prefix the
bundle name with the vendor name, it's up to the vendor to ensure that each
bundle name is unique. I insist that a bundle name must be unique. This was
the opposite before as two bundles with the same name was how Symfony2 found
inheritance.
A new getParent() method has been added to BundleInterface. It returns the
bundle name that the bundle overrides (this is optional of course). That way,
there is no ordering problem anymore as the inheritance tree is explicitely
defined by the bundle themselves.
So, with this system, we can easily have an inheritance tree like the
following:
FooBundle < MyFooBundle < MyCustomFooBundle
MyCustomFooBundle returns MyFooBundle for the getParent() method, and
MyFooBundle returns FooBundle.
If two bundles override the same bundle, an exception is thrown.
Based on the bundle name, you can now reference any resource with this
notation:
@FooBundle/Resources/config/routing.xml
@FooBundle/Controller/FooController.php
This notation is the input of the Kernel::locateResource() method, which
returns the location of the file (and of course it takes into account
overloading).
So, in the routing, you can now use the following:
<import resource="@FrameworkBundle/Resources/config/internal.xml" />
The template loading mechanism also use this method under the hood.
As a bonus, all the code that converts from internal notations to file names
(controller names: ControllerNameParser, template names: TemplateNameParser,
resource paths, ...) is now contained in several well-defined classes. The
same goes for the code that look for templates (TemplateLocator), routing
files (FileLocator), ...
As a side note, it is really easy to also support multiple-inheritance for a
bundle (for instance if a bundle returns an array of bundle names it extends).
However, this is not implemented in this patch as I'm not sure we want to
support that.
How to upgrade:
* Each bundle must now implement two new mandatory methods: getPath() and
getNamespace(), and optionally the getParent() method if the bundle extends
another one. Here is a common implementation for these methods:
/**
* {@inheritdoc}
*/
public function getParent()
{
return 'MyFrameworkBundle';
}
/**
* {@inheritdoc}
*/
public function getNamespace()
{
return __NAMESPACE__;
}
/**
* {@inheritdoc}
*/
public function getPath()
{
return strtr(__DIR__, '\\', '/');
}
* The registerBundleDirs() can be removed from your Kernel class;
* If your code relies on getBundleDirs() or the kernel.bundle_dirs parameter,
it should be upgraded to use the new interface (see Doctrine commands for
many example of such a change);
* When referencing a bundle, you must now always use its name (no more \ or /
in bundle names) -- this transition was already done for most things
before, and now applies to the routing as well;
* Imports in routing files must be changed:
Before: <import resource="Sensio/CasBundle/Resources/config/internal.xml" />
After: <import resource="@SensioCasBundle/Resources/config/internal.xml" />
2011-01-18 09:23:49 +00:00
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerNameParser',
|
2010-08-18 12:43:32 +01:00
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Controller\\ControllerResolver',
|
2011-07-23 15:40:25 +01:00
|
|
|
// Cannot be included because annotations will parse the big compiled class file
|
|
|
|
// 'Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller',
|
2010-08-18 12:43:32 +01:00
|
|
|
));
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
|
2014-05-10 23:14:12 +01:00
|
|
|
/**
|
|
|
|
* {@inheritdoc}
|
|
|
|
*/
|
|
|
|
public function getConfiguration(array $config, ContainerBuilder $container)
|
|
|
|
{
|
|
|
|
return new Configuration($container->getParameter('kernel.debug'));
|
|
|
|
}
|
|
|
|
|
2010-09-15 19:49:16 +01:00
|
|
|
/**
|
2011-05-18 11:54:16 +01:00
|
|
|
* Loads Form configuration.
|
2010-09-15 19:49:16 +01:00
|
|
|
*
|
2011-05-18 11:54:16 +01:00
|
|
|
* @param array $config A configuration array
|
2010-09-15 19:49:16 +01:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2011-05-18 11:54:16 +01:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2012-12-16 12:02:54 +00:00
|
|
|
*
|
|
|
|
* @throws \LogicException
|
2010-09-15 19:49:16 +01:00
|
|
|
*/
|
2011-05-18 11:54:16 +01:00
|
|
|
private function registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader)
|
2010-09-15 19:49:16 +01:00
|
|
|
{
|
2011-05-18 11:54:16 +01:00
|
|
|
$loader->load('form.xml');
|
2013-11-30 09:53:03 +00:00
|
|
|
if (null === $config['form']['csrf_protection']['enabled']) {
|
|
|
|
$config['form']['csrf_protection']['enabled'] = $config['csrf_protection']['enabled'];
|
|
|
|
}
|
|
|
|
|
2013-10-09 09:42:58 +01:00
|
|
|
if ($this->isConfigEnabled($container, $config['form']['csrf_protection'])) {
|
2011-05-18 11:54:16 +01:00
|
|
|
$loader->load('form_csrf.xml');
|
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
$container->setParameter('form.type_extension.csrf.enabled', true);
|
2013-10-09 09:42:58 +01:00
|
|
|
|
|
|
|
if (null !== $config['form']['csrf_protection']['field_name']) {
|
|
|
|
$container->setParameter('form.type_extension.csrf.field_name', $config['form']['csrf_protection']['field_name']);
|
|
|
|
} else {
|
|
|
|
$container->setParameter('form.type_extension.csrf.field_name', $config['csrf_protection']['field_name']);
|
|
|
|
}
|
2013-01-23 14:18:20 +00:00
|
|
|
} else {
|
|
|
|
$container->setParameter('form.type_extension.csrf.enabled', false);
|
2011-05-18 11:54:16 +01:00
|
|
|
}
|
2010-09-15 19:49:16 +01:00
|
|
|
}
|
|
|
|
|
2011-01-17 15:21:46 +00:00
|
|
|
/**
|
|
|
|
* Loads the ESI configuration.
|
|
|
|
*
|
2013-01-31 09:37:27 +00:00
|
|
|
* @param array $config An ESI configuration array
|
2013-01-23 14:18:20 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2013-01-31 09:37:27 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2011-01-17 15:21:46 +00:00
|
|
|
*/
|
2013-01-23 14:18:20 +00:00
|
|
|
private function registerEsiConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2011-01-17 15:21:46 +00:00
|
|
|
{
|
2013-01-23 14:18:20 +00:00
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
2011-01-17 15:21:46 +00:00
|
|
|
}
|
2013-01-23 14:18:20 +00:00
|
|
|
|
|
|
|
$loader->load('esi.xml');
|
2011-01-17 15:21:46 +00:00
|
|
|
}
|
|
|
|
|
2014-03-23 00:04:57 +00:00
|
|
|
/**
|
|
|
|
* Loads the SSI configuration.
|
|
|
|
*
|
|
|
|
* @param array $config An SSI configuration array
|
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
|
|
|
*/
|
|
|
|
private function registerSsiConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
|
|
|
{
|
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$loader->load('ssi.xml');
|
|
|
|
}
|
|
|
|
|
2013-01-22 09:24:26 +00:00
|
|
|
/**
|
2013-01-31 09:37:27 +00:00
|
|
|
* Loads the fragments configuration.
|
2013-01-22 09:24:26 +00:00
|
|
|
*
|
2013-01-31 09:37:27 +00:00
|
|
|
* @param array $config A fragments configuration array
|
2013-01-23 14:18:20 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2013-01-31 09:37:27 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2013-01-22 09:24:26 +00:00
|
|
|
*/
|
2013-01-31 09:37:27 +00:00
|
|
|
private function registerFragmentsConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2013-01-22 09:24:26 +00:00
|
|
|
{
|
2013-01-23 14:18:20 +00:00
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
2013-01-22 09:24:26 +00:00
|
|
|
}
|
2013-01-23 14:18:20 +00:00
|
|
|
|
2013-01-31 09:37:27 +00:00
|
|
|
$loader->load('fragment_listener.xml');
|
|
|
|
$container->setParameter('fragment.path', $config['path']);
|
2013-01-22 09:24:26 +00:00
|
|
|
}
|
|
|
|
|
2010-09-27 08:46:15 +01:00
|
|
|
/**
|
2011-01-24 19:50:31 +00:00
|
|
|
* Loads the profiler configuration.
|
2010-09-27 08:46:15 +01:00
|
|
|
*
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param array $config A profiler configuration array
|
2010-09-27 08:46:15 +01:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2012-12-16 12:02:54 +00:00
|
|
|
*
|
|
|
|
* @throws \LogicException
|
2010-09-27 08:46:15 +01:00
|
|
|
*/
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
private function registerProfilerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2010-09-27 08:46:15 +01:00
|
|
|
{
|
2013-04-26 14:53:58 +01:00
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
2013-04-26 15:27:29 +01:00
|
|
|
// this is needed for the WebProfiler to work even if the profiler is disabled
|
|
|
|
$container->setParameter('data_collector.templates', array());
|
|
|
|
|
2013-04-26 14:53:58 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-02-06 10:24:56 +00:00
|
|
|
$loader->load('profiling.xml');
|
|
|
|
$loader->load('collectors.xml');
|
|
|
|
|
2015-03-20 23:12:36 +00:00
|
|
|
if ($this->formConfigEnabled) {
|
2013-09-26 14:56:56 +01:00
|
|
|
$loader->load('form_debug.xml');
|
|
|
|
}
|
2013-10-30 08:33:58 +00:00
|
|
|
|
2015-03-20 23:12:36 +00:00
|
|
|
if ($this->translationConfigEnabled) {
|
|
|
|
$loader->load('translation_debug.xml');
|
|
|
|
$container->getDefinition('translator.data_collector')->setDecoratedService('translator');
|
|
|
|
}
|
|
|
|
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('profiler_listener.only_exceptions', $config['only_exceptions']);
|
|
|
|
$container->setParameter('profiler_listener.only_master_requests', $config['only_master_requests']);
|
2011-03-16 14:50:48 +00:00
|
|
|
|
|
|
|
// Choose storage class based on the DSN
|
|
|
|
$supported = array(
|
2014-10-22 19:27:13 +01:00
|
|
|
'sqlite' => 'Symfony\Component\HttpKernel\Profiler\SqliteProfilerStorage',
|
|
|
|
'mysql' => 'Symfony\Component\HttpKernel\Profiler\MysqlProfilerStorage',
|
|
|
|
'file' => 'Symfony\Component\HttpKernel\Profiler\FileProfilerStorage',
|
|
|
|
'mongodb' => 'Symfony\Component\HttpKernel\Profiler\MongoDbProfilerStorage',
|
|
|
|
'memcache' => 'Symfony\Component\HttpKernel\Profiler\MemcacheProfilerStorage',
|
2011-12-01 21:18:49 +00:00
|
|
|
'memcached' => 'Symfony\Component\HttpKernel\Profiler\MemcachedProfilerStorage',
|
2014-10-22 19:27:13 +01:00
|
|
|
'redis' => 'Symfony\Component\HttpKernel\Profiler\RedisProfilerStorage',
|
2011-03-16 14:50:48 +00:00
|
|
|
);
|
2015-02-18 07:05:44 +00:00
|
|
|
list($class) = explode(':', $config['dsn'], 2);
|
2011-03-16 14:50:48 +00:00
|
|
|
if (!isset($supported[$class])) {
|
|
|
|
throw new \LogicException(sprintf('Driver "%s" is not supported for the profiler.', $class));
|
2011-02-05 21:19:14 +00:00
|
|
|
}
|
2010-09-27 15:53:23 +01:00
|
|
|
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('profiler.storage.dsn', $config['dsn']);
|
|
|
|
$container->setParameter('profiler.storage.username', $config['username']);
|
|
|
|
$container->setParameter('profiler.storage.password', $config['password']);
|
|
|
|
$container->setParameter('profiler.storage.lifetime', $config['lifetime']);
|
|
|
|
|
|
|
|
$container->getDefinition('profiler.storage')->setClass($supported[$class]);
|
2010-09-27 15:53:23 +01:00
|
|
|
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
if (isset($config['matcher'])) {
|
2011-02-05 21:19:14 +00:00
|
|
|
if (isset($config['matcher']['service'])) {
|
|
|
|
$container->setAlias('profiler.request_matcher', $config['matcher']['service']);
|
2013-06-24 21:26:23 +01:00
|
|
|
} elseif (isset($config['matcher']['ip']) || isset($config['matcher']['path']) || isset($config['matcher']['ips'])) {
|
2011-02-05 21:19:14 +00:00
|
|
|
$definition = $container->register('profiler.request_matcher', 'Symfony\\Component\\HttpFoundation\\RequestMatcher');
|
|
|
|
$definition->setPublic(false);
|
2010-09-27 08:46:15 +01:00
|
|
|
|
2011-02-05 21:19:14 +00:00
|
|
|
if (isset($config['matcher']['ip'])) {
|
|
|
|
$definition->addMethodCall('matchIp', array($config['matcher']['ip']));
|
|
|
|
}
|
|
|
|
|
2013-06-24 21:26:23 +01:00
|
|
|
if (isset($config['matcher']['ips'])) {
|
|
|
|
$definition->addMethodCall('matchIps', array($config['matcher']['ips']));
|
|
|
|
}
|
|
|
|
|
2011-02-05 21:19:14 +00:00
|
|
|
if (isset($config['matcher']['path'])) {
|
|
|
|
$definition->addMethodCall('matchPath', array($config['matcher']['path']));
|
2010-09-27 08:46:15 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-07-13 14:40:24 +01:00
|
|
|
|
2013-04-26 14:53:58 +01:00
|
|
|
if (!$config['collect']) {
|
2012-07-13 14:40:24 +01:00
|
|
|
$container->getDefinition('profiler')->addMethodCall('disable', array());
|
|
|
|
}
|
2010-09-27 08:46:15 +01:00
|
|
|
}
|
|
|
|
|
2010-09-15 19:49:16 +01:00
|
|
|
/**
|
2011-01-24 19:50:31 +00:00
|
|
|
* Loads the router configuration.
|
2010-09-15 19:49:16 +01:00
|
|
|
*
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param array $config A router configuration array
|
2010-09-15 19:49:16 +01:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2010-09-15 19:49:16 +01:00
|
|
|
*/
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
private function registerRouterConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2010-09-15 19:49:16 +01:00
|
|
|
{
|
2011-01-24 19:50:31 +00:00
|
|
|
$loader->load('routing.xml');
|
|
|
|
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('router.resource', $config['resource']);
|
2013-03-01 16:33:44 +00:00
|
|
|
$container->setParameter('router.cache_class_prefix', $container->getParameter('kernel.name').ucfirst($container->getParameter('kernel.environment')));
|
2011-07-18 09:05:28 +01:00
|
|
|
$router = $container->findDefinition('router.default');
|
2012-06-09 15:43:04 +01:00
|
|
|
$argument = $router->getArgument(2);
|
2012-07-30 17:24:12 +01:00
|
|
|
$argument['strict_requirements'] = $config['strict_requirements'];
|
2011-02-10 15:26:13 +00:00
|
|
|
if (isset($config['type'])) {
|
2011-04-28 10:26:10 +01:00
|
|
|
$argument['resource_type'] = $config['type'];
|
2011-02-10 15:26:13 +00:00
|
|
|
}
|
2012-06-09 15:43:04 +01:00
|
|
|
$router->replaceArgument(2, $argument);
|
2011-02-10 15:26:13 +00:00
|
|
|
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('request_listener.http_port', $config['http_port']);
|
|
|
|
$container->setParameter('request_listener.https_port', $config['https_port']);
|
2011-04-19 23:25:45 +01:00
|
|
|
|
2011-01-24 19:50:31 +00:00
|
|
|
$this->addClassesToCompile(array(
|
|
|
|
'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
|
2011-07-21 21:32:50 +01:00
|
|
|
'Symfony\\Component\\Routing\\RequestContext',
|
|
|
|
'Symfony\\Component\\Routing\\Router',
|
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Routing\\RedirectableUrlMatcher',
|
2011-07-18 09:05:28 +01:00
|
|
|
$container->findDefinition('router.default')->getClass(),
|
2011-01-24 19:50:31 +00:00
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Loads the session configuration.
|
|
|
|
*
|
|
|
|
* @param array $config A session configuration array
|
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
|
|
|
*/
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
private function registerSessionConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2011-01-24 19:50:31 +00:00
|
|
|
{
|
|
|
|
$loader->load('session.xml');
|
2011-01-23 07:36:19 +00:00
|
|
|
|
2011-04-22 11:35:09 +01:00
|
|
|
// session storage
|
|
|
|
$container->setAlias('session.storage', $config['storage_id']);
|
|
|
|
$options = array();
|
2012-06-29 17:34:28 +01:00
|
|
|
foreach (array('name', 'cookie_lifetime', 'cookie_path', 'cookie_domain', 'cookie_secure', 'cookie_httponly', 'gc_maxlifetime', 'gc_probability', 'gc_divisor') as $key) {
|
2011-01-24 19:50:31 +00:00
|
|
|
if (isset($config[$key])) {
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
$options[$key] = $config[$key];
|
2010-12-14 14:51:10 +00:00
|
|
|
}
|
2010-09-15 19:49:16 +01:00
|
|
|
}
|
2012-02-29 08:44:47 +00:00
|
|
|
|
2011-04-22 11:35:09 +01:00
|
|
|
$container->setParameter('session.storage.options', $options);
|
2010-11-25 08:04:24 +00:00
|
|
|
|
2012-03-03 09:03:04 +00:00
|
|
|
// session handler (the internal callback registered with PHP session management)
|
2013-11-17 14:05:15 +00:00
|
|
|
if (null === $config['handler_id']) {
|
2012-08-17 17:38:35 +01:00
|
|
|
// Set the handler class to be null
|
|
|
|
$container->getDefinition('session.storage.native')->replaceArgument(1, null);
|
2013-06-07 23:05:01 +01:00
|
|
|
$container->getDefinition('session.storage.php_bridge')->replaceArgument(0, null);
|
2012-08-17 17:38:35 +01:00
|
|
|
} else {
|
2013-09-24 23:02:41 +01:00
|
|
|
$handlerId = $config['handler_id'];
|
|
|
|
|
|
|
|
if ($config['metadata_update_threshold'] > 0) {
|
|
|
|
$container->getDefinition('session.handler.write_check')->addArgument(new Reference($handlerId));
|
|
|
|
$handlerId = 'session.handler.write_check';
|
|
|
|
}
|
|
|
|
|
|
|
|
$container->setAlias('session.handler', $handlerId);
|
2012-08-17 17:38:35 +01:00
|
|
|
}
|
2012-03-03 09:03:04 +00:00
|
|
|
|
2012-04-13 09:34:00 +01:00
|
|
|
$container->setParameter('session.save_path', $config['save_path']);
|
|
|
|
|
2011-01-16 09:17:38 +00:00
|
|
|
$this->addClassesToCompile(array(
|
2011-05-31 09:09:25 +01:00
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\EventListener\\SessionListener',
|
2012-03-14 15:14:09 +00:00
|
|
|
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\NativeSessionStorage',
|
2013-04-05 12:57:01 +01:00
|
|
|
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\PhpBridgeSessionStorage',
|
2012-07-13 20:14:31 +01:00
|
|
|
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Handler\\NativeFileSessionHandler',
|
2012-05-30 11:07:22 +01:00
|
|
|
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\AbstractProxy',
|
|
|
|
'Symfony\\Component\\HttpFoundation\\Session\\Storage\\Proxy\\SessionHandlerProxy',
|
2011-04-23 10:43:35 +01:00
|
|
|
$container->getDefinition('session')->getClass(),
|
2010-11-25 08:04:24 +00:00
|
|
|
));
|
2011-04-28 10:27:56 +01:00
|
|
|
|
|
|
|
if ($container->hasDefinition($config['storage_id'])) {
|
|
|
|
$this->addClassesToCompile(array(
|
|
|
|
$container->findDefinition('session.storage')->getClass(),
|
|
|
|
));
|
|
|
|
}
|
2013-09-24 23:02:41 +01:00
|
|
|
|
|
|
|
$container->setParameter('session.metadata.update_threshold', $config['metadata_update_threshold']);
|
2010-09-15 19:49:16 +01:00
|
|
|
}
|
|
|
|
|
2013-12-25 21:24:54 +00:00
|
|
|
/**
|
|
|
|
* Loads the request configuration.
|
|
|
|
*
|
2015-06-21 19:10:28 +01:00
|
|
|
* @param array $config A request configuration array
|
2013-12-25 21:24:54 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
|
|
|
*/
|
|
|
|
private function registerRequestConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
|
|
|
{
|
|
|
|
if ($config['formats']) {
|
|
|
|
$loader->load('request.xml');
|
|
|
|
$container
|
|
|
|
->getDefinition('request.add_request_formats_listener')
|
|
|
|
->replaceArgument(0, $config['formats'])
|
|
|
|
;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-11 15:58:07 +00:00
|
|
|
/**
|
2011-01-24 19:50:31 +00:00
|
|
|
* Loads the templating configuration.
|
2011-01-11 15:58:07 +00:00
|
|
|
*
|
2012-05-18 18:41:48 +01:00
|
|
|
* @param array $config A templating configuration array
|
2011-04-23 16:05:44 +01:00
|
|
|
* @param string $ide
|
2011-01-11 15:58:07 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2011-01-11 15:58:07 +00:00
|
|
|
*/
|
2011-04-05 07:03:29 +01:00
|
|
|
private function registerTemplatingConfiguration(array $config, $ide, ContainerBuilder $container, XmlFileLoader $loader)
|
2010-09-20 20:01:41 +01:00
|
|
|
{
|
2011-01-24 19:50:31 +00:00
|
|
|
$loader->load('templating.xml');
|
|
|
|
|
2015-08-14 11:18:53 +01:00
|
|
|
if (!$container->hasParameter('templating.helper.code.file_link_format')) {
|
|
|
|
$links = array(
|
|
|
|
'textmate' => 'txmt://open?url=file://%%f&line=%%l',
|
|
|
|
'macvim' => 'mvim://open?url=file://%%f&line=%%l',
|
|
|
|
'emacs' => 'emacs://open?url=file://%%f&line=%%l',
|
|
|
|
'sublime' => 'subl://open?url=file://%%f&line=%%l',
|
|
|
|
);
|
|
|
|
|
2015-08-29 19:06:03 +01:00
|
|
|
$container->setParameter('templating.helper.code.file_link_format', str_replace('%', '%%', ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format')) ?: (isset($links[$ide]) ? $links[$ide] : $ide));
|
2015-08-14 11:18:53 +01:00
|
|
|
}
|
2011-04-05 07:03:29 +01:00
|
|
|
|
2013-02-19 11:01:40 +00:00
|
|
|
$container->setParameter('fragment.renderer.hinclude.global_template', $config['hinclude_default_template']);
|
2011-04-05 07:03:29 +01:00
|
|
|
|
2015-01-10 10:34:10 +00:00
|
|
|
if ($container->getParameter('kernel.debug')) {
|
|
|
|
$logger = new Reference('logger', ContainerInterface::IGNORE_ON_INVALID_REFERENCE);
|
|
|
|
|
|
|
|
$container->getDefinition('templating.loader.cache')
|
|
|
|
->addTag('monolog.logger', array('channel' => 'templating'))
|
|
|
|
->addMethodCall('setLogger', array($logger));
|
|
|
|
$container->getDefinition('templating.loader.chain')
|
|
|
|
->addTag('monolog.logger', array('channel' => 'templating'))
|
|
|
|
->addMethodCall('setLogger', array($logger));
|
|
|
|
}
|
|
|
|
|
2011-02-10 20:40:00 +00:00
|
|
|
if (!empty($config['loaders'])) {
|
2013-12-28 07:46:05 +00:00
|
|
|
$loaders = array_map(function ($loader) { return new Reference($loader); }, $config['loaders']);
|
2011-01-24 19:50:31 +00:00
|
|
|
|
2011-02-06 20:39:30 +00:00
|
|
|
// Use a delegation unless only a single loader was registered
|
2011-01-24 19:50:31 +00:00
|
|
|
if (1 === count($loaders)) {
|
|
|
|
$container->setAlias('templating.loader', (string) reset($loaders));
|
|
|
|
} else {
|
|
|
|
$container->getDefinition('templating.loader.chain')->addArgument($loaders);
|
|
|
|
$container->setAlias('templating.loader', 'templating.loader.chain');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('templating.loader.cache.path', null);
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
if (isset($config['cache'])) {
|
2011-01-24 19:50:31 +00:00
|
|
|
// Wrap the existing loader with cache (must happen after loaders are registered)
|
|
|
|
$container->setDefinition('templating.loader.wrapped', $container->findDefinition('templating.loader'));
|
2011-04-04 10:56:41 +01:00
|
|
|
$loaderCache = $container->getDefinition('templating.loader.cache');
|
2011-05-13 10:57:05 +01:00
|
|
|
$container->setParameter('templating.loader.cache.path', $config['cache']);
|
2011-04-04 10:56:41 +01:00
|
|
|
|
|
|
|
$container->setDefinition('templating.loader', $loaderCache);
|
2011-01-24 19:50:31 +00:00
|
|
|
}
|
|
|
|
|
2011-01-16 09:17:38 +00:00
|
|
|
$this->addClassesToCompile(array(
|
2011-07-21 21:32:50 +01:00
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Templating\\GlobalVariables',
|
2011-02-10 17:20:44 +00:00
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateReference',
|
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Templating\\TemplateNameParser',
|
2011-01-24 19:50:31 +00:00
|
|
|
$container->findDefinition('templating.locator')->getClass(),
|
2010-09-20 20:01:41 +01:00
|
|
|
));
|
2011-01-24 19:50:31 +00:00
|
|
|
|
2011-02-10 21:05:04 +00:00
|
|
|
$container->setParameter('templating.engines', $config['engines']);
|
2013-12-28 07:46:05 +00:00
|
|
|
$engines = array_map(function ($engine) { return new Reference('templating.engine.'.$engine); }, $config['engines']);
|
2011-01-24 19:50:31 +00:00
|
|
|
|
2011-02-26 17:41:17 +00:00
|
|
|
// Use a delegation unless only a single engine was registered
|
2011-01-24 19:50:31 +00:00
|
|
|
if (1 === count($engines)) {
|
|
|
|
$container->setAlias('templating', (string) reset($engines));
|
|
|
|
} else {
|
2013-01-18 14:46:50 +00:00
|
|
|
foreach ($engines as $engine) {
|
|
|
|
$container->getDefinition('templating.engine.delegating')->addMethodCall('addEngine', array($engine));
|
|
|
|
}
|
2011-01-24 19:50:31 +00:00
|
|
|
$container->setAlias('templating', 'templating.engine.delegating');
|
|
|
|
}
|
2015-01-10 10:34:10 +00:00
|
|
|
|
2015-01-12 13:49:09 +00:00
|
|
|
$container->getDefinition('fragment.renderer.hinclude')
|
|
|
|
->addTag('kernel.fragment_renderer', array('alias' => 'hinclude'))
|
|
|
|
->replaceArgument(0, new Reference('templating'))
|
|
|
|
;
|
|
|
|
|
2015-01-10 10:34:10 +00:00
|
|
|
// configure the PHP engine if needed
|
|
|
|
if (in_array('php', $config['engines'], true)) {
|
|
|
|
$loader->load('templating_php.xml');
|
|
|
|
|
|
|
|
$container->setParameter('templating.helper.form.resources', $config['form']['resources']);
|
|
|
|
|
|
|
|
if ($container->getParameter('kernel.debug')) {
|
|
|
|
$loader->load('templating_debug.xml');
|
|
|
|
|
|
|
|
$container->setDefinition('templating.engine.php', $container->findDefinition('debug.templating.engine.php'));
|
|
|
|
$container->setAlias('debug.templating.engine.php', 'templating.engine.php');
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->addClassesToCompile(array(
|
|
|
|
'Symfony\\Component\\Templating\\Storage\\FileStorage',
|
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Templating\\PhpEngine',
|
|
|
|
'Symfony\\Bundle\\FrameworkBundle\\Templating\\Loader\\FilesystemLoader',
|
|
|
|
));
|
|
|
|
}
|
2015-04-20 17:28:31 +01:00
|
|
|
|
|
|
|
if ($container->hasDefinition('assets.packages')) {
|
|
|
|
$container->getDefinition('templating.helper.assets')->replaceArgument(0, new Reference('assets.packages'));
|
|
|
|
} else {
|
|
|
|
$container->removeDefinition('templating.helper.assets');
|
|
|
|
}
|
2010-09-20 20:01:41 +01:00
|
|
|
}
|
|
|
|
|
2014-12-28 18:57:17 +00:00
|
|
|
/**
|
|
|
|
* Loads the assets configuration.
|
|
|
|
*
|
|
|
|
* @param array $config A assets configuration array
|
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
|
|
|
*/
|
|
|
|
private function registerAssetsConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
|
|
|
{
|
2015-02-12 12:06:55 +00:00
|
|
|
$loader->load('assets.xml');
|
|
|
|
|
2015-01-17 07:35:04 +00:00
|
|
|
$defaultVersion = $this->createVersion($container, $config['version'], $config['version_format'], '_default');
|
2014-12-28 18:57:17 +00:00
|
|
|
|
|
|
|
$defaultPackage = $this->createPackageDefinition($config['base_path'], $config['base_urls'], $defaultVersion);
|
|
|
|
$container->setDefinition('assets._default_package', $defaultPackage);
|
|
|
|
|
|
|
|
$namedPackages = array();
|
|
|
|
foreach ($config['packages'] as $name => $package) {
|
2015-11-09 20:52:37 +00:00
|
|
|
if (!array_key_exists('version', $package)) {
|
2014-12-28 18:57:17 +00:00
|
|
|
$version = $defaultVersion;
|
|
|
|
} else {
|
|
|
|
$format = $package['version_format'] ?: $config['version_format'];
|
|
|
|
$version = $this->createVersion($container, $package['version'], $format, $name);
|
|
|
|
}
|
|
|
|
|
|
|
|
$container->setDefinition('assets._package_'.$name, $this->createPackageDefinition($package['base_path'], $package['base_urls'], $version));
|
|
|
|
$namedPackages[$name] = new Reference('assets._package_'.$name);
|
|
|
|
}
|
|
|
|
|
|
|
|
$container->getDefinition('assets.packages')
|
|
|
|
->replaceArgument(0, new Reference('assets._default_package'))
|
|
|
|
->replaceArgument(1, $namedPackages)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a definition for an asset package.
|
|
|
|
*/
|
|
|
|
private function createPackageDefinition($basePath, array $baseUrls, Reference $version)
|
|
|
|
{
|
|
|
|
if ($basePath && $baseUrls) {
|
|
|
|
throw new \LogicException('An asset package cannot have base URLs and base paths.');
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$baseUrls) {
|
|
|
|
$package = new DefinitionDecorator('assets.path_package');
|
|
|
|
|
|
|
|
return $package
|
|
|
|
->setPublic(false)
|
|
|
|
->replaceArgument(0, $basePath)
|
|
|
|
->replaceArgument(1, $version)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
$package = new DefinitionDecorator('assets.url_package');
|
|
|
|
|
|
|
|
return $package
|
|
|
|
->setPublic(false)
|
|
|
|
->replaceArgument(0, $baseUrls)
|
|
|
|
->replaceArgument(1, $version)
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2015-01-17 07:35:04 +00:00
|
|
|
private function createVersion(ContainerBuilder $container, $version, $format, $name)
|
2014-12-28 18:57:17 +00:00
|
|
|
{
|
2015-01-17 07:35:04 +00:00
|
|
|
if (null === $version) {
|
2014-12-28 18:57:17 +00:00
|
|
|
return new Reference('assets.empty_version_strategy');
|
|
|
|
}
|
|
|
|
|
|
|
|
$def = new DefinitionDecorator('assets.static_version_strategy');
|
|
|
|
$def
|
|
|
|
->replaceArgument(0, $version)
|
|
|
|
->replaceArgument(1, $format)
|
|
|
|
;
|
|
|
|
$container->setDefinition('assets._version_'.$name, $def);
|
|
|
|
|
|
|
|
return new Reference('assets._version_'.$name);
|
|
|
|
}
|
|
|
|
|
2011-01-11 15:58:07 +00:00
|
|
|
/**
|
2011-01-24 19:50:31 +00:00
|
|
|
* Loads the translator configuration.
|
2011-01-11 15:58:07 +00:00
|
|
|
*
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param array $config A translator configuration array
|
2011-01-11 15:58:07 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
*/
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
private function registerTranslatorConfiguration(array $config, ContainerBuilder $container)
|
2010-09-02 12:54:32 +01:00
|
|
|
{
|
2013-01-23 14:18:20 +00:00
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
|
|
|
}
|
2015-03-20 23:12:36 +00:00
|
|
|
$this->translationConfigEnabled = true;
|
2012-06-16 17:09:40 +01:00
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
// Use the "real" translator instead of the identity default
|
|
|
|
$container->setAlias('translator', 'translator.default');
|
|
|
|
$translator = $container->findDefinition('translator.default');
|
2015-01-12 11:17:42 +00:00
|
|
|
$translator->addMethodCall('setFallbackLocales', array($config['fallbacks']));
|
2012-07-15 14:56:45 +01:00
|
|
|
|
2014-05-10 23:14:12 +01:00
|
|
|
$container->setParameter('translator.logging', $config['logging']);
|
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
// Discover translation directories
|
|
|
|
$dirs = array();
|
2015-01-08 16:22:13 +00:00
|
|
|
if (class_exists('Symfony\Component\Validator\Validation')) {
|
|
|
|
$r = new \ReflectionClass('Symfony\Component\Validator\Validation');
|
2013-01-23 14:18:20 +00:00
|
|
|
|
2015-07-07 20:01:23 +01:00
|
|
|
$dirs[] = dirname($r->getFileName()).'/Resources/translations';
|
2013-01-23 14:18:20 +00:00
|
|
|
}
|
|
|
|
if (class_exists('Symfony\Component\Form\Form')) {
|
|
|
|
$r = new \ReflectionClass('Symfony\Component\Form\Form');
|
|
|
|
|
2015-07-07 20:01:23 +01:00
|
|
|
$dirs[] = dirname($r->getFileName()).'/Resources/translations';
|
2013-01-23 14:18:20 +00:00
|
|
|
}
|
|
|
|
if (class_exists('Symfony\Component\Security\Core\Exception\AuthenticationException')) {
|
|
|
|
$r = new \ReflectionClass('Symfony\Component\Security\Core\Exception\AuthenticationException');
|
|
|
|
|
2015-10-06 16:02:37 +01:00
|
|
|
$dirs[] = dirname($r->getFileName()).'/../Resources/translations';
|
2013-01-23 14:18:20 +00:00
|
|
|
}
|
2016-01-09 06:10:09 +00:00
|
|
|
$rootDir = $container->getParameter('kernel.root_dir');
|
2013-01-23 14:18:20 +00:00
|
|
|
foreach ($container->getParameter('kernel.bundles') as $bundle => $class) {
|
|
|
|
$reflection = new \ReflectionClass($class);
|
2015-07-07 20:01:23 +01:00
|
|
|
if (is_dir($dir = dirname($reflection->getFileName()).'/Resources/translations')) {
|
2013-01-23 14:18:20 +00:00
|
|
|
$dirs[] = $dir;
|
2011-01-24 19:50:31 +00:00
|
|
|
}
|
2016-01-09 06:10:09 +00:00
|
|
|
if (is_dir($dir = $rootDir.sprintf('/Resources/%s/translations', $bundle))) {
|
2011-01-24 19:50:31 +00:00
|
|
|
$dirs[] = $dir;
|
|
|
|
}
|
2013-01-23 14:18:20 +00:00
|
|
|
}
|
2016-01-09 06:10:09 +00:00
|
|
|
if (is_dir($dir = $rootDir.'/Resources/translations')) {
|
2013-01-23 14:18:20 +00:00
|
|
|
$dirs[] = $dir;
|
|
|
|
}
|
2010-09-02 12:54:32 +01:00
|
|
|
|
2013-01-23 14:18:20 +00:00
|
|
|
// Register translation resources
|
|
|
|
if ($dirs) {
|
|
|
|
foreach ($dirs as $dir) {
|
|
|
|
$container->addResource(new DirectoryResource($dir));
|
|
|
|
}
|
2015-03-10 21:45:35 +00:00
|
|
|
|
|
|
|
$files = array();
|
2013-01-23 14:18:20 +00:00
|
|
|
$finder = Finder::create()
|
|
|
|
->files()
|
|
|
|
->filter(function (\SplFileInfo $file) {
|
|
|
|
return 2 === substr_count($file->getBasename(), '.') && preg_match('/\.\w+$/', $file->getBasename());
|
|
|
|
})
|
|
|
|
->in($dirs)
|
|
|
|
;
|
|
|
|
|
2015-03-24 13:45:14 +00:00
|
|
|
$locales = array();
|
2013-01-23 14:18:20 +00:00
|
|
|
foreach ($finder as $file) {
|
|
|
|
list($domain, $locale, $format) = explode('.', $file->getBasename(), 3);
|
2015-03-24 13:45:14 +00:00
|
|
|
if (!isset($files[$locale])) {
|
|
|
|
$files[$locale] = array();
|
|
|
|
}
|
|
|
|
|
|
|
|
$files[$locale][] = (string) $file;
|
2010-09-02 12:54:32 +01:00
|
|
|
}
|
2015-03-10 21:45:35 +00:00
|
|
|
|
2015-03-24 13:45:14 +00:00
|
|
|
$options = array_merge(
|
|
|
|
$translator->getArgument(3),
|
|
|
|
array('resource_files' => $files)
|
|
|
|
);
|
|
|
|
|
|
|
|
$translator->replaceArgument(3, $options);
|
2011-01-24 19:50:31 +00:00
|
|
|
}
|
2010-09-02 12:54:32 +01:00
|
|
|
}
|
|
|
|
|
2011-01-11 15:58:07 +00:00
|
|
|
/**
|
|
|
|
* Loads the validator configuration.
|
|
|
|
*
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param array $config A validation configuration array
|
2011-01-11 15:58:07 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2011-01-24 19:50:31 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2011-01-11 15:58:07 +00:00
|
|
|
*/
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
private function registerValidationConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
2010-08-18 13:44:35 +01:00
|
|
|
{
|
2013-01-23 14:18:20 +00:00
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
[FrameworkBundle] Integrate Configuration\Builder class for config merging and normalization
This fixes some BC problems introduced in f9138d313b83f951cf82a2f7f902a2d6dd14fbb3. Some top-level can now be simply enabled by providing true/null in PHP/YAML. Additionally, the Configuration\Builder allows options to be unset by providing "false" (helpful for overriding activation in a previous config file). All options supporting these behaviors can be found in the Configuration.php file (look for canBeUnset() and treatNull/TrueLike()).
Major changes:
* Removed "enabled" option for profiler config. Profiler is now enabled if its config is true, null or a map.
* Restore original config structure for validation namespaces. In PHP/YAML, namespaces are defined under annotations as an alternative to false (disabled) and true/null (enabled). For XML, annotation remains a boolean attribute for validation and a one or more optional namespace tags may appear within <app:validation />. During config normalization, namespace tags under validation will be moved to annotations to conform to the PHP/YAML structure (this occurs transparently to the user).
* Restore behavior for router/templating config sections being optional (as shown in changes to session/validation test fixtures). If either top-level section is unset in the configuration, neither feature will be enabled and the user will no longer receive exceptions due to missing a resource option (router) or engines (templating). Resource/engines will still be properly required if the respective feature is enabled.
* Remove unused router type option from XML config XSD. Type is only relevant for import statements, so this option is likely useless.
Additional small changes:
* Added isset()'s, since config options may be unset
* Wrap registerXxxConfiguration() calls in isset() checks
* Load translation.xml in configLoad(), since it's always required
* Default cache_warmer value (!kernel.debug) is determined via Configuration class
Things to be fixed:
* Configuration\Builder doesn't seem to respect isRequired() and requiresAtLeastOneElement() (or I haven't set it properly); this should replace the need for FrameworkExtension to throw exceptions for bad router/templating configs
* The config nodes for session options don't have the "pdo." prefix, as dots are not allowed in node names. To preserve BC for now, the "pdo." prefix is still allowed (and mandated by XSD) in configuration files. In the future, we may just want to do away with the "pdo." prefix.
* Translator has an "enabled" option. If there's no use case for setting "fallback" independently (when "enabled" is false), perhaps "enabled" should be removed entirely and translator should function like profiler currently does.
* Profiler matcher merging might need to be adjusted so multiple configs simply overwrite matcher instead of merging its array keys.
2011-02-06 09:29:16 +00:00
|
|
|
$loader->load('validator.xml');
|
2010-08-18 13:44:35 +01:00
|
|
|
|
2014-03-18 16:36:12 +00:00
|
|
|
$validatorBuilder = $container->getDefinition('validator.builder');
|
|
|
|
|
2012-11-27 22:18:12 +00:00
|
|
|
$container->setParameter('validator.translation_domain', $config['translation_domain']);
|
2014-03-18 16:36:12 +00:00
|
|
|
|
2014-12-25 10:36:58 +00:00
|
|
|
list($xmlMappings, $yamlMappings) = $this->getValidatorMappingFiles($container);
|
2014-03-18 16:36:12 +00:00
|
|
|
if (count($xmlMappings) > 0) {
|
|
|
|
$validatorBuilder->addMethodCall('addXmlMappings', array($xmlMappings));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (count($yamlMappings) > 0) {
|
|
|
|
$validatorBuilder->addMethodCall('addYamlMappings', array($yamlMappings));
|
|
|
|
}
|
2010-08-18 13:44:35 +01:00
|
|
|
|
2013-09-19 17:03:48 +01:00
|
|
|
$definition = $container->findDefinition('validator.email');
|
|
|
|
$definition->replaceArgument(0, $config['strict_email']);
|
|
|
|
|
2011-08-04 11:56:01 +01:00
|
|
|
if (array_key_exists('enable_annotations', $config) && $config['enable_annotations']) {
|
2014-03-30 17:56:20 +01:00
|
|
|
$validatorBuilder->addMethodCall('enableAnnotationMapping', array(new Reference('annotation_reader')));
|
2014-03-18 16:36:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (array_key_exists('static_method', $config) && $config['static_method']) {
|
|
|
|
foreach ($config['static_method'] as $methodName) {
|
|
|
|
$validatorBuilder->addMethodCall('addMethodMapping', array($methodName));
|
|
|
|
}
|
2010-08-18 13:44:35 +01:00
|
|
|
}
|
2011-03-29 22:07:50 +01:00
|
|
|
|
|
|
|
if (isset($config['cache'])) {
|
|
|
|
$container->setParameter(
|
|
|
|
'validator.mapping.cache.prefix',
|
2015-12-10 10:46:31 +00:00
|
|
|
'validator_'.$this->getKernelRootHash($container)
|
2011-03-29 22:07:50 +01:00
|
|
|
);
|
2014-03-18 16:36:12 +00:00
|
|
|
|
2014-12-13 20:05:40 +00:00
|
|
|
$validatorBuilder->addMethodCall('setMetadataCache', array(new Reference($config['cache'])));
|
2014-03-18 16:36:12 +00:00
|
|
|
}
|
|
|
|
|
2014-08-06 12:56:27 +01:00
|
|
|
// You can use this parameter to check the API version in your own
|
|
|
|
// bundle extension classes
|
2015-03-22 15:12:19 +00:00
|
|
|
// This is set to 2.5-bc for compatibility with Symfony 2.5 and 2.6.
|
2015-01-25 05:54:05 +00:00
|
|
|
// @deprecated since version 2.7, to be removed in 3.0
|
2015-03-22 15:12:19 +00:00
|
|
|
$container->setParameter('validator.api', '2.5-bc');
|
2010-08-18 13:44:35 +01:00
|
|
|
}
|
|
|
|
|
2014-12-25 10:36:58 +00:00
|
|
|
private function getValidatorMappingFiles(ContainerBuilder $container)
|
2011-04-01 07:26:19 +01:00
|
|
|
{
|
2014-12-25 10:36:58 +00:00
|
|
|
$files = array(array(), array());
|
2013-11-05 10:46:57 +00:00
|
|
|
|
|
|
|
if (interface_exists('Symfony\Component\Form\FormInterface')) {
|
|
|
|
$reflClass = new \ReflectionClass('Symfony\Component\Form\FormInterface');
|
2014-12-25 10:36:58 +00:00
|
|
|
$files[0][] = dirname($reflClass->getFileName()).'/Resources/config/validation.xml';
|
|
|
|
$container->addResource(new FileResource($files[0][0]));
|
2013-11-05 10:46:57 +00:00
|
|
|
}
|
2011-04-01 07:26:19 +01:00
|
|
|
|
2014-12-25 10:36:58 +00:00
|
|
|
$bundles = $container->getParameter('kernel.bundles');
|
|
|
|
foreach ($bundles as $bundle) {
|
2011-04-01 07:26:19 +01:00
|
|
|
$reflection = new \ReflectionClass($bundle);
|
2015-07-09 17:07:40 +01:00
|
|
|
$dirname = dirname($reflection->getFileName());
|
2014-12-25 10:36:58 +00:00
|
|
|
|
|
|
|
if (is_file($file = $dirname.'/Resources/config/validation.xml')) {
|
|
|
|
$files[0][] = realpath($file);
|
2011-04-01 07:26:19 +01:00
|
|
|
$container->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
2014-12-25 10:36:58 +00:00
|
|
|
if (is_file($file = $dirname.'/Resources/config/validation.yml')) {
|
|
|
|
$files[1][] = realpath($file);
|
2011-04-01 07:26:19 +01:00
|
|
|
$container->addResource(new FileResource($file));
|
|
|
|
}
|
2015-03-04 23:15:43 +00:00
|
|
|
|
|
|
|
if (is_dir($dir = $dirname.'/Resources/config/validation')) {
|
|
|
|
foreach (Finder::create()->files()->in($dir)->name('*.xml') as $file) {
|
|
|
|
$files[0][] = $file->getRealpath();
|
|
|
|
}
|
|
|
|
foreach (Finder::create()->files()->in($dir)->name('*.yml') as $file) {
|
|
|
|
$files[1][] = $file->getRealpath();
|
|
|
|
}
|
|
|
|
|
|
|
|
$container->addResource(new DirectoryResource($dir));
|
|
|
|
}
|
2011-04-01 07:26:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return $files;
|
|
|
|
}
|
|
|
|
|
2013-10-09 09:42:58 +01:00
|
|
|
private function registerAnnotationsConfiguration(array $config, ContainerBuilder $container, $loader)
|
2011-05-03 13:36:42 +01:00
|
|
|
{
|
|
|
|
$loader->load('annotations.xml');
|
|
|
|
|
|
|
|
if ('file' === $config['cache']) {
|
2011-05-24 12:29:44 +01:00
|
|
|
$cacheDir = $container->getParameterBag()->resolveValue($config['file_cache_dir']);
|
2015-02-10 15:07:19 +00:00
|
|
|
if (!is_dir($cacheDir) && false === @mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
|
2011-05-03 13:36:42 +01:00
|
|
|
throw new \RuntimeException(sprintf('Could not create cache directory "%s".', $cacheDir));
|
|
|
|
}
|
|
|
|
|
|
|
|
$container
|
2011-05-24 12:29:44 +01:00
|
|
|
->getDefinition('annotations.file_cache_reader')
|
|
|
|
->replaceArgument(1, $cacheDir)
|
|
|
|
->replaceArgument(2, $config['debug'])
|
2011-05-03 13:36:42 +01:00
|
|
|
;
|
2011-05-24 12:29:44 +01:00
|
|
|
$container->setAlias('annotation_reader', 'annotations.file_cache_reader');
|
2012-05-01 13:46:26 +01:00
|
|
|
} elseif ('none' !== $config['cache']) {
|
2011-05-03 13:36:42 +01:00
|
|
|
$container
|
|
|
|
->getDefinition('annotations.cached_reader')
|
|
|
|
->replaceArgument(1, new Reference($config['cache']))
|
2011-05-24 12:29:44 +01:00
|
|
|
->replaceArgument(2, $config['debug'])
|
2011-05-03 13:36:42 +01:00
|
|
|
;
|
2011-05-24 12:29:44 +01:00
|
|
|
$container->setAlias('annotation_reader', 'annotations.cached_reader');
|
2011-05-03 13:36:42 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-21 18:05:54 +01:00
|
|
|
private function registerPropertyAccessConfiguration(array $config, ContainerBuilder $container)
|
|
|
|
{
|
|
|
|
$container
|
|
|
|
->getDefinition('property_accessor')
|
|
|
|
->replaceArgument(0, $config['magic_call'])
|
|
|
|
->replaceArgument(1, $config['throw_exception_on_invalid_index'])
|
|
|
|
;
|
|
|
|
}
|
|
|
|
|
2013-10-09 09:42:58 +01:00
|
|
|
/**
|
|
|
|
* Loads the security configuration.
|
|
|
|
*
|
|
|
|
* @param array $config A CSRF configuration array
|
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
|
|
|
*
|
|
|
|
* @throws \LogicException
|
|
|
|
*/
|
|
|
|
private function registerSecurityCsrfConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
|
|
|
{
|
|
|
|
if (!$this->isConfigEnabled($container, $config)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$this->sessionConfigEnabled) {
|
|
|
|
throw new \LogicException('CSRF protection needs sessions to be enabled.');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Enable services for CSRF protection (even without forms)
|
|
|
|
$loader->load('security_csrf.xml');
|
|
|
|
}
|
|
|
|
|
2014-12-25 03:17:33 +00:00
|
|
|
/**
|
|
|
|
* Loads the serializer configuration.
|
|
|
|
*
|
2015-03-20 23:12:36 +00:00
|
|
|
* @param array $config A serializer configuration array
|
2014-12-25 03:17:33 +00:00
|
|
|
* @param ContainerBuilder $container A ContainerBuilder instance
|
2015-03-20 23:12:36 +00:00
|
|
|
* @param XmlFileLoader $loader An XmlFileLoader instance
|
2014-12-25 03:17:33 +00:00
|
|
|
*/
|
|
|
|
private function registerSerializerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
|
|
|
|
{
|
|
|
|
if (!$config['enabled']) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
$loader->load('serializer.xml');
|
|
|
|
$chainLoader = $container->getDefinition('serializer.mapping.chain_loader');
|
|
|
|
|
|
|
|
$serializerLoaders = array();
|
|
|
|
if (isset($config['enable_annotations']) && $config['enable_annotations']) {
|
|
|
|
$annotationLoader = new Definition(
|
|
|
|
'Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader',
|
|
|
|
array(new Reference('annotation_reader'))
|
|
|
|
);
|
|
|
|
$annotationLoader->setPublic(false);
|
|
|
|
|
|
|
|
$serializerLoaders[] = $annotationLoader;
|
|
|
|
}
|
|
|
|
|
|
|
|
$bundles = $container->getParameter('kernel.bundles');
|
|
|
|
foreach ($bundles as $bundle) {
|
|
|
|
$reflection = new \ReflectionClass($bundle);
|
2015-07-09 17:32:09 +01:00
|
|
|
$dirname = dirname($reflection->getFileName());
|
2014-12-25 03:17:33 +00:00
|
|
|
|
|
|
|
if (is_file($file = $dirname.'/Resources/config/serialization.xml')) {
|
|
|
|
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array(realpath($file)));
|
|
|
|
$definition->setPublic(false);
|
|
|
|
|
|
|
|
$serializerLoaders[] = $definition;
|
|
|
|
$container->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_file($file = $dirname.'/Resources/config/serialization.yml')) {
|
|
|
|
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array(realpath($file)));
|
|
|
|
$definition->setPublic(false);
|
|
|
|
|
|
|
|
$serializerLoaders[] = $definition;
|
|
|
|
$container->addResource(new FileResource($file));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (is_dir($dir = $dirname.'/Resources/config/serialization')) {
|
|
|
|
foreach (Finder::create()->files()->in($dir)->name('*.xml') as $file) {
|
|
|
|
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\XmlFileLoader', array($file->getRealpath()));
|
|
|
|
$definition->setPublic(false);
|
|
|
|
|
|
|
|
$serializerLoaders[] = $definition;
|
|
|
|
}
|
|
|
|
foreach (Finder::create()->files()->in($dir)->name('*.yml') as $file) {
|
|
|
|
$definition = new Definition('Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader', array($file->getRealpath()));
|
|
|
|
$definition->setPublic(false);
|
|
|
|
|
|
|
|
$serializerLoaders[] = $definition;
|
|
|
|
}
|
|
|
|
|
|
|
|
$container->addResource(new DirectoryResource($dir));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$chainLoader->replaceArgument(0, $serializerLoaders);
|
|
|
|
|
|
|
|
if (isset($config['cache']) && $config['cache']) {
|
|
|
|
$container->setParameter(
|
|
|
|
'serializer.mapping.cache.prefix',
|
2015-12-10 10:46:31 +00:00
|
|
|
'serializer_'.$this->getKernelRootHash($container)
|
2014-12-25 03:17:33 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
$container->getDefinition('serializer.mapping.class_metadata_factory')->replaceArgument(
|
|
|
|
1, new Reference($config['cache'])
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-10 10:46:31 +00:00
|
|
|
/**
|
|
|
|
* Gets a hash of the kernel root directory.
|
|
|
|
*
|
|
|
|
* @param ContainerBuilder $container
|
|
|
|
*
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
private function getKernelRootHash(ContainerBuilder $container)
|
|
|
|
{
|
|
|
|
if (!$this->kernelRootHash) {
|
|
|
|
$this->kernelRootHash = hash('sha256', $container->getParameter('kernel.root_dir'));
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->kernelRootHash;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
{
|
2011-03-06 11:40:06 +00:00
|
|
|
return 'http://symfony.com/schema/dic/symfony';
|
2010-02-17 13:55:05 +00:00
|
|
|
}
|
|
|
|
}
|