Jelajahi Sumber

[FrameworkBundle][SecurityBundle] fixes a regression in the listener order

Johannes Schmitt 14 tahun lalu
induk
melakukan
a97e8b82d0

+ 2 - 29
src/Symfony/Bundle/FrameworkBundle/RequestListener.php

@@ -17,14 +17,13 @@ use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Routing\Matcher\Exception\MethodNotAllowedException;
 use Symfony\Component\Routing\Matcher\Exception\NotFoundException;
 use Symfony\Component\Routing\RouterInterface;
 use Symfony\Component\Routing\RequestContext;
 
 /**
- * RequestListener.
+ * Initializes request attributes based on a matching route.
  *
  * @author Fabien Potencier <fabien@symfony.com>
  */
@@ -32,13 +31,11 @@ class RequestListener
 {
     private $router;
     private $logger;
-    private $container;
     private $httpPort;
     private $httpsPort;
 
-    public function __construct(ContainerInterface $container, RouterInterface $router, $httpPort = 80, $httpsPort = 443, LoggerInterface $logger = null)
+    public function __construct(RouterInterface $router, $httpPort = 80, $httpsPort = 443, LoggerInterface $logger = null)
     {
-        $this->container = $container;
         $this->router = $router;
         $this->httpPort = $httpPort;
         $this->httpsPort = $httpsPort;
@@ -50,30 +47,6 @@ class RequestListener
         $request = $event->getRequest();
         $master = HttpKernelInterface::MASTER_REQUEST === $event->getRequestType();
 
-        $this->initializeSession($request, $master);
-
-        $this->initializeRequestAttributes($request, $master);
-    }
-
-    protected function initializeSession(Request $request, $master)
-    {
-        if (!$master) {
-            return;
-        }
-
-        // inject the session object if none is present
-        if (null === $request->getSession() && $this->container->has('session')) {
-            $request->setSession($this->container->get('session'));
-        }
-
-        // starts the session if a session cookie already exists in the request...
-        if ($request->hasPreviousSession()) {
-            $request->getSession()->start();
-        }
-    }
-
-    protected function initializeRequestAttributes(Request $request, $master)
-    {
         if ($master) {
             // set the context even if the parsing does not need to be done
             // to have correct link generation

+ 50 - 0
src/Symfony/Bundle/FrameworkBundle/Listener/SessionInitializingListener.php

@@ -0,0 +1,50 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Bundle\FrameworkBundle\Listener;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+
+/**
+ * Sets the session on the request.
+ *
+ * This will also start the session if it was already started during a previous
+ * request.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class SessionInitializingListener
+{
+    private $container;
+
+    public function onCoreRequest(GetResponseEvent $event)
+    {
+        if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
+            return;
+        }
+
+        if (!$this->container->has('session')) {
+            return;
+        }
+
+        $request = $event->getRequest();
+        if ($request->hasSession()) {
+            return;
+        }
+
+        $request->setSession($session = $this->container->get('session'));
+
+        if ($request->hasPreviousSession()) {
+            $session->start();
+        }
+    }
+}

+ 8 - 3
src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml

@@ -5,7 +5,8 @@
     xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
     <parameters>
-        <parameter key="request_listener.class">Symfony\Bundle\FrameworkBundle\RequestListener</parameter>
+        <parameter key="request_attribute_initializing_listener.class">Symfony\Bundle\FrameworkBundle\Listener\RequestAttributeInitializingListener</parameter>
+        <parameter key="session_initializing_listener.class">Symfony\Bundle\FrameworkBundle\Listener\SessionInitializingListener</parameter>
         <parameter key="controller_resolver.class">Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver</parameter>
         <parameter key="controller_name_converter.class">Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser</parameter>
         <parameter key="response_listener.class">Symfony\Component\HttpKernel\ResponseListener</parameter>
@@ -26,15 +27,19 @@
             <argument type="service" id="logger" on-invalid="ignore" />
         </service>
 
-        <service id="request_listener" class="%request_listener.class%">
+        <service id="request_attribute_initializing_listener" class="%request_attribute_initializing_listener.class%">
             <tag name="kernel.listener" event="onCoreRequest" />
             <tag name="monolog.logger" channel="request" />
-            <argument type="service" id="service_container" />
             <argument type="service" id="router" />
             <argument>%request_listener.http_port%</argument>
             <argument>%request_listener.https_port%</argument>
             <argument type="service" id="logger" on-invalid="ignore" />
         </service>
+        
+        <service id="session_initializing_listener" class="%session_initializing_listener.class%">
+            <tag name="kernel.listener" event="onCoreRequest" priority="255" />
+            <property name="container" type="service" id="service_container" />
+        </service>
 
         <service id="response_listener" class="%response_listener.class%">
             <tag name="kernel.listener" event="onCoreResponse" />

+ 1 - 1
src/Symfony/Bundle/SecurityBundle/Resources/config/security.xml

@@ -98,7 +98,7 @@
 
         <!-- Firewall related services -->
         <service id="security.firewall" class="%security.firewall.class%">
-            <tag name="kernel.listener" event="onCoreRequest" priority="-128" />
+            <tag name="kernel.listener" event="onCoreRequest" priority="254" />
             <argument type="service" id="security.firewall.map" />
             <argument type="service" id="event_dispatcher" />
         </service>