Explorar o código

fixed request management

 * The "main" request is stored in the RequestHandler
 * The request is passed to the core.response event
Fabien Potencier %!s(int64=15) %!d(string=hai) anos
pai
achega
711b3d371a

+ 29 - 8
src/Symfony/Components/RequestHandler/RequestHandler.php

@@ -25,6 +25,7 @@ use Symfony\Components\RequestHandler\Exception\NotFoundHttpException;
 class RequestHandler implements RequestHandlerInterface
 {
   protected $dispatcher;
+  protected $request;
 
   /**
    * Constructor
@@ -36,6 +37,16 @@ class RequestHandler implements RequestHandlerInterface
     $this->dispatcher = $dispatcher;
   }
 
+  /**
+   * Gets the Request instance associated with the main request.
+   *
+   * @return Request A Request instance
+   */
+  public function getRequest()
+  {
+    return $this->request;
+  }
+
   /**
    * Handles a request to convert it to a response.
    *
@@ -49,10 +60,20 @@ class RequestHandler implements RequestHandlerInterface
    *
    * @throws \Exception When Exception couldn't be caught by event processing
    */
-  public function handle(Request $request, $main = true)
+  public function handle(Request $request = null, $main = true)
   {
     $main = (Boolean) $main;
 
+    if (null === $request)
+    {
+      $request = new Request();
+    }
+
+    if (true === $main)
+    {
+      $this->request = $request;
+    }
+
     try
     {
       return $this->handleRaw($request, $main);
@@ -63,7 +84,7 @@ class RequestHandler implements RequestHandlerInterface
       $event = $this->dispatcher->notifyUntil(new Event($this, 'core.exception', array('main_request' => $main, 'request' => $request, 'exception' => $e)));
       if ($event->isProcessed())
       {
-        return $this->filterResponse($event->getReturnValue(), 'A "core.exception" listener returned a non response object.', $main);
+        return $this->filterResponse($event->getReturnValue(), $request, 'A "core.exception" listener returned a non response object.', $main);
       }
 
       throw $e;
@@ -91,7 +112,7 @@ class RequestHandler implements RequestHandlerInterface
     $event = $this->dispatcher->notifyUntil(new Event($this, 'core.request', array('main_request' => $main, 'request' => $request)));
     if ($event->isProcessed())
     {
-      return $this->filterResponse($event->getReturnValue(), 'A "core.request" listener returned a non response object.', $main);
+      return $this->filterResponse($event->getReturnValue(), $request, 'A "core.request" listener returned a non response object.', $main);
     }
 
     // load controller
@@ -115,7 +136,7 @@ class RequestHandler implements RequestHandlerInterface
     {
       try
       {
-        return $this->filterResponse($event->getReturnValue(), 'A "core.controller" listener returned a non response object.', $main);
+        return $this->filterResponse($event->getReturnValue(), $request, 'A "core.controller" listener returned a non response object.', $main);
       }
       catch (\Exception $e)
       {
@@ -129,9 +150,9 @@ class RequestHandler implements RequestHandlerInterface
     }
 
     // view
-    $event = $this->dispatcher->filter(new Event($this, 'core.view', array('main_request' => $main)), $retval);
+    $event = $this->dispatcher->filter(new Event($this, 'core.view', array('main_request' => $main, 'request' => $request)), $retval);
 
-    return $this->filterResponse($event->getReturnValue(), sprintf('The controller must return a response (instead of %s).', is_object($event->getReturnValue()) ? 'an object of class '.get_class($event->getReturnValue()) : str_replace("\n", '', var_export($event->getReturnValue(), true))), $main);
+    return $this->filterResponse($event->getReturnValue(), $request, sprintf('The controller must return a response (instead of %s).', is_object($event->getReturnValue()) ? 'an object of class '.get_class($event->getReturnValue()) : str_replace("\n", '', var_export($event->getReturnValue(), true))), $main);
   }
 
   /**
@@ -144,14 +165,14 @@ class RequestHandler implements RequestHandlerInterface
    *
    * @throws \RuntimeException if the response object does not implement the send() method
    */
-  protected function filterResponse($response, $message, $main)
+  protected function filterResponse($response, $request, $message, $main)
   {
     if (!$response instanceof Response)
     {
       throw new \RuntimeException($message);
     }
 
-    $event = $this->dispatcher->filter(new Event($this, 'core.response', array('main_request' => $main)), $response);
+    $event = $this->dispatcher->filter(new Event($this, 'core.response', array('main_request' => $main, 'request' => $request)), $response);
     $response = $event->getReturnValue();
 
     if (!$response instanceof Response)

+ 8 - 1
src/Symfony/Components/RequestHandler/RequestHandlerInterface.php

@@ -30,5 +30,12 @@ interface RequestHandlerInterface
    *
    * @throws \Exception When Exception couldn't be caught by event processing
    */
-  public function handle(Request $request, $main = true);
+  public function handle(Request $request = null, $main = true);
+
+  /**
+   * Gets the Request instance associated with the main request.
+   *
+   * @return Request A Request instance
+   */
+  public function getRequest();
 }

+ 16 - 0
src/Symfony/Foundation/Kernel.php

@@ -38,6 +38,7 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
   protected $booted;
   protected $name;
   protected $startTime;
+  protected $request;
 
   const VERSION = '2.0.0-DEV';
 
@@ -155,6 +156,16 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
     $this->boot();
   }
 
+  /**
+   * Gets the Request instance associated with the main request.
+   *
+   * @return Request A Request instance
+   */
+  public function getRequest()
+  {
+    return $this->request;
+  }
+
   public function handle(Request $request = null, $main = true)
   {
     if (false === $this->booted)
@@ -171,6 +182,11 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
       $this->container->setService('request', $request);
     }
 
+    if (true === $main)
+    {
+      $this->request = $request;
+    }
+
     return $this->container->getRequestHandlerService()->handle($request);
   }
 

+ 12 - 0
src/Symfony/Foundation/bootstrap.php

@@ -383,6 +383,7 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
   protected $booted;
   protected $name;
   protected $startTime;
+  protected $request;
 
   const VERSION = '2.0.0-DEV';
 
@@ -470,6 +471,12 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
     $this->boot();
   }
 
+  
+  public function getRequest()
+  {
+    return $this->request;
+  }
+
   public function handle(Request $request = null, $main = true)
   {
     if (false === $this->booted)
@@ -486,6 +493,11 @@ abstract class Kernel implements RequestHandlerInterface, \Serializable
       $this->container->setService('request', $request);
     }
 
+    if (true === $main)
+    {
+      $this->request = $request;
+    }
+
     return $this->container->getRequestHandlerService()->handle($request);
   }
 

+ 4 - 5
src/Symfony/Framework/WebBundle/Listener/ResponseFilter.php

@@ -26,12 +26,10 @@ use Symfony\Components\RequestHandler\Response;
 class ResponseFilter
 {
   protected $dispatcher;
-  protected $request;
 
-  public function __construct(EventDispatcher $dispatcher, Request $request)
+  public function __construct(EventDispatcher $dispatcher)
   {
     $this->dispatcher = $dispatcher;
-    $this->request = $request;
   }
 
   public function register()
@@ -46,8 +44,9 @@ class ResponseFilter
       return $response;
     }
 
-    $format = $this->request->getRequestFormat();
-    if ((null !== $format) && $mimeType = $this->request->getMimeType($format))
+    $request = $event->getParameter('request');
+    $format = $request->getRequestFormat();
+    if ((null !== $format) && $mimeType = $request->getMimeType($format))
     {
       $response->setHeader('Content-Type', $mimeType);
     }

+ 0 - 1
src/Symfony/Framework/WebBundle/Resources/config/web.xml

@@ -46,7 +46,6 @@
     <service id="response_filter" class="%response_filter.class%">
       <annotation name="kernel.listener" event="core.response" method="filter" />
       <argument type="service" id="event_dispatcher" />
-      <argument type="service" id="request" />
     </service>
 
     <service id="exception_handler" class="%exception_handler.class%">