diff --git a/library/Zend/Mvc/Application.php b/library/Zend/Mvc/Application.php index a0fcc201bdf..3062045daf5 100644 --- a/library/Zend/Mvc/Application.php +++ b/library/Zend/Mvc/Application.php @@ -280,6 +280,7 @@ public function run() $response = $result->last(); if ($response instanceof ResponseInterface) { $event->setTarget($this); + $event->setResponse($response); $events->trigger(MvcEvent::EVENT_FINISH, $event); return $response; } @@ -299,6 +300,7 @@ public function run() $response = $result->last(); if ($response instanceof ResponseInterface) { $event->setTarget($this); + $event->setResponse($response); $events->trigger(MvcEvent::EVENT_FINISH, $event); return $response; } diff --git a/tests/ZendTest/Mvc/ApplicationTest.php b/tests/ZendTest/Mvc/ApplicationTest.php index 08e096ff3be..09954ba6ff2 100644 --- a/tests/ZendTest/Mvc/ApplicationTest.php +++ b/tests/ZendTest/Mvc/ApplicationTest.php @@ -576,4 +576,56 @@ public function testOnDispatchErrorEventPassedToTriggersShouldBeTheOriginalOne() $event = $this->application->getMvcEvent(); $this->assertInstanceOf('Zend\View\Model\ViewModel', $event->getResult()); } + + /** + * @group 2981 + */ + public function testReturnsResponseFromListenerWhenRouteEventShortCircuits() + { + $this->application->bootstrap(); + $testResponse = new Response(); + $response = $this->application->getResponse(); + $events = $this->application->getEventManager(); + $events->clearListeners(MvcEvent::EVENT_DISPATCH); + $events->attach(MvcEvent::EVENT_ROUTE, function ($e) use ($testResponse) { + $testResponse->setContent('triggered'); + return $testResponse; + }, 100); + + $self = $this; + $triggered = false; + $events->attach(MvcEvent::EVENT_FINISH, function ($e) use ($self, $testResponse, &$triggered) { + $self->assertSame($testResponse, $e->getResponse()); + $triggered = true; + }); + + $this->application->run(); + $this->assertTrue($triggered); + } + + /** + * @group 2981 + */ + public function testReturnsResponseFromListenerWhenDispatchEventShortCircuits() + { + $this->application->bootstrap(); + $testResponse = new Response(); + $response = $this->application->getResponse(); + $events = $this->application->getEventManager(); + $events->clearListeners(MvcEvent::EVENT_ROUTE); + $events->attach(MvcEvent::EVENT_DISPATCH, function ($e) use ($testResponse) { + $testResponse->setContent('triggered'); + return $testResponse; + }, 100); + + $self = $this; + $triggered = false; + $events->attach(MvcEvent::EVENT_FINISH, function ($e) use ($self, $testResponse, &$triggered) { + $self->assertSame($testResponse, $e->getResponse()); + $triggered = true; + }); + + $this->application->run(); + $this->assertTrue($triggered); + } }