fixed form configuration when no session is available (closes #841)

This commit is contained in:
Fabien Potencier 2011-05-18 12:54:16 +02:00
parent fdbdcbbd0a
commit 0687aadad2
3 changed files with 55 additions and 26 deletions

View File

@ -41,7 +41,6 @@ class FrameworkExtension extends Extension
$loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('web.xml');
$loader->load('form.xml');
$loader->load('services.xml');
// A translator must always be registered (as support is included by
@ -70,9 +69,7 @@ class FrameworkExtension extends Extension
$loader->load('test.xml');
}
if (isset($config['csrf_protection'])) {
$this->registerCsrfProtectionConfiguration($config['csrf_protection'], $container);
}
$this->registerFormConfiguration($config, $container, $loader);
if (isset($config['esi'])) {
$this->registerEsiConfiguration($config['esi'], $loader);
@ -135,15 +132,32 @@ class FrameworkExtension extends Extension
}
/**
* Loads the CSRF protection configuration.
* Loads Form configuration.
*
* @param array $config A CSRF protection configuration array
* @param array $config A configuration array
* @param ContainerBuilder $container A ContainerBuilder instance
* @param XmlFileLoader $loader An XmlFileLoader instance
*/
private function registerCsrfProtectionConfiguration(array $config, ContainerBuilder $container)
private function registerFormConfiguration($config, ContainerBuilder $container, XmlFileLoader $loader)
{
$container->setParameter('form.type_extension.csrf.enabled', $config['enabled']);
$container->setParameter('form.type_extension.csrf.field_name', $config['field_name']);
$loader->load('form.xml');
if (isset($config['csrf_protection'])) {
if (!isset($config['session'])) {
throw new \LogicException('CSRF protection needs that sessions are enabled.');
}
$loader->load('form_csrf.xml');
$container->setParameter('form.type_extension.csrf.enabled', $config['csrf_protection']['enabled']);
$container->setParameter('form.type_extension.csrf.field_name', $config['csrf_protection']['field_name']);
}
if (isset($config['session'])) {
$container->removeDefinition('file.temporary_storage');
$container->setDefinition('file.temporary_storage', $container->getDefinition('file.temporary_storage.session'));
$container->removeDefinition('file.temporary_storage.session');
} else {
$container->removeDefinition('file.temporary_storage.session');
}
}
/**

View File

@ -8,8 +8,8 @@
<parameter key="form.extension.class">Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension</parameter>
<parameter key="form.factory.class">Symfony\Component\Form\FormFactory</parameter>
<parameter key="form.type_guesser.validator.class">Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser</parameter>
<parameter key="form.csrf_provider.class">Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider</parameter>
<parameter key="file.temporary_storage.class">Symfony\Component\HttpFoundation\File\SessionBasedTemporaryStorage</parameter>
<parameter key="file.temporary_storage.class">Symfony\Component\HttpFoundation\File\TemporaryStorage</parameter>
<parameter key="file.temporary_storage.session.class">Symfony\Component\HttpFoundation\File\SessionBasedTemporaryStorage</parameter>
</parameters>
<services>
@ -51,15 +51,14 @@
<argument type="service" id="validator.mapping.class_metadata_factory" />
</service>
<!-- CsrfProvider -->
<service id="form.csrf_provider" class="%form.csrf_provider.class%">
<!-- TemporaryStorage - where should we put this? -->
<service id="file.temporary_storage.session" class="%file.temporary_storage.session.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
<argument>%kernel.cache_dir%/upload</argument>
</service>
<!-- TemporaryStorage - where should we put this? -->
<service id="file.temporary_storage" class="%file.temporary_storage.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
<argument>%kernel.cache_dir%/upload</argument>
</service>
@ -151,16 +150,5 @@
<tag name="form.type_extension" alias="field" />
<argument type="service" id="validator" />
</service>
<!-- CsrfExtension -->
<service id="form.type.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\CsrfType">
<tag name="form.type" alias="csrf" />
<argument type="service" id="form.csrf_provider" />
</service>
<service id="form.type_extension.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension">
<tag name="form.type_extension" alias="form" />
<argument>%form.type_extension.csrf.enabled%</argument>
<argument>%form.type_extension.csrf.field_name%</argument>
</service>
</services>
</container>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<parameter key="form.csrf_provider.class">Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider</parameter>
</parameters>
<services>
<service id="form.csrf_provider" class="%form.csrf_provider.class%">
<argument type="service" id="session" />
<argument>%kernel.secret%</argument>
</service>
<service id="form.type.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\CsrfType">
<tag name="form.type" alias="csrf" />
<argument type="service" id="form.csrf_provider" />
</service>
<service id="form.type_extension.csrf" class="Symfony\Component\Form\Extension\Csrf\Type\FormTypeCsrfExtension">
<tag name="form.type_extension" alias="form" />
<argument>%form.type_extension.csrf.enabled%</argument>
<argument>%form.type_extension.csrf.field_name%</argument>
</service>
</services>
</container>