Browse Source

[HttpKernel] changed core.view event to use notifyUntil() instead of filter() -- as soon as a listener returns a Response, we are done

Fabien Potencier 14 years ago
parent
commit
fc372bc217

+ 5 - 2
src/Symfony/Component/HttpKernel/HttpKernel.php

@@ -108,8 +108,11 @@ class HttpKernel implements HttpKernelInterface
 
         // view
         if (!$response instanceof Response) {
-            $event = new Event($this, 'core.view', array('request_type' => $type, 'request' => $request));
-            $response = $this->dispatcher->filter($event, $response);
+            $event = new Event($this, 'core.view', array('request_type' => $type, 'request' => $request, 'controller_value' => $response));
+            $retval = $this->dispatcher->notifyUntil($event);
+            if ($event->isProcessed()) {
+                $response = $retval;
+            }
         }
 
         return $this->filterResponse($response, $request, sprintf('The controller must return a response (%s given).', $this->varToString($response)), $type);

+ 8 - 4
tests/Symfony/Tests/Component/HttpKernel/HttpKernelTest.php

@@ -105,9 +105,11 @@ class HttpKernelTest extends \PHPUnit_Framework_TestCase
     public function testHandleWhenControllerDoesNotReturnAResponseButAViewIsRegistered()
     {
         $dispatcher = new EventDispatcher();
-        $dispatcher->connect('core.view', function ($event, $retval)
+        $dispatcher->connect('core.view', function ($event)
         {
-            return new Response($retval);
+            $event->setProcessed();
+
+            return new Response($event->get('controller_value'));
         });
         $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));
 
@@ -120,9 +122,11 @@ class HttpKernelTest extends \PHPUnit_Framework_TestCase
     public function testHandleWhenAViewDoesNotReturnAResponse()
     {
         $dispatcher = new EventDispatcher();
-        $dispatcher->connect('core.view', function ($event, $retval)
+        $dispatcher->connect('core.view', function ($event)
         {
-            return $retval;
+            $event->setProcessed();
+
+            return $event->get('controller_value');
         });
         $kernel = new HttpKernel($dispatcher, $this->getResolver(function () { return 'foo'; }));