Pārlūkot izejas kodu

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

Fabien Potencier 14 gadi atpakaļ
vecāks
revīzija
0687aadad2

+ 23 - 9
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

@@ -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');
+        }
     }
 
     /**

+ 5 - 17
src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml

@@ -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>

+ 27 - 0
src/Symfony/Bundle/FrameworkBundle/Resources/config/form_csrf.xml

@@ -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>