diff --git a/src/Illuminate/Routing/Events/PreparingResponse.php b/src/Illuminate/Routing/Events/PreparingResponse.php new file mode 100644 index 000000000000..2c060a02ac93 --- /dev/null +++ b/src/Illuminate/Routing/Events/PreparingResponse.php @@ -0,0 +1,33 @@ +request = $request; + $this->response = $response; + } +} diff --git a/src/Illuminate/Routing/Events/ResponsePrepared.php b/src/Illuminate/Routing/Events/ResponsePrepared.php new file mode 100644 index 000000000000..5fb866d289f4 --- /dev/null +++ b/src/Illuminate/Routing/Events/ResponsePrepared.php @@ -0,0 +1,33 @@ +request = $request; + $this->response = $response; + } +} diff --git a/src/Illuminate/Routing/Router.php b/src/Illuminate/Routing/Router.php index ecb492d1f0d5..ee416226b1cc 100644 --- a/src/Illuminate/Routing/Router.php +++ b/src/Illuminate/Routing/Router.php @@ -15,6 +15,8 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; +use Illuminate\Routing\Events\PreparingResponse; +use Illuminate\Routing\Events\ResponsePrepared; use Illuminate\Routing\Events\RouteMatched; use Illuminate\Routing\Events\Routing; use Illuminate\Support\Arr; @@ -871,7 +873,11 @@ protected function sortMiddleware(Collection $middlewares) */ public function prepareResponse($request, $response) { - return static::toResponse($request, $response); + $this->events->dispatch(new PreparingResponse($request, $response)); + + return tap(static::toResponse($request, $response), function ($response) use ($request) { + $this->events->dispatch(new ResponsePrepared($request, $response)); + }); } /** diff --git a/tests/Routing/RoutingRouteTest.php b/tests/Routing/RoutingRouteTest.php index ff25733fb7b6..d5766ed5f67b 100644 --- a/tests/Routing/RoutingRouteTest.php +++ b/tests/Routing/RoutingRouteTest.php @@ -23,6 +23,8 @@ use Illuminate\Routing\Contracts\ControllerDispatcher as ControllerDispatcherContract; use Illuminate\Routing\Controller; use Illuminate\Routing\ControllerDispatcher; +use Illuminate\Routing\Events\PreparingResponse; +use Illuminate\Routing\Events\ResponsePrepared; use Illuminate\Routing\Events\Routing; use Illuminate\Routing\Exceptions\UrlGenerationException; use Illuminate\Routing\Middleware\SubstituteBindings; @@ -2169,11 +2171,45 @@ public function testRouteCanMiddlewareCanBeAssigned() ], $route->middleware()); } - protected function getRouter() + public function testItDispatchesEventsWhilePreparingRequest() { + $events = new Dispatcher; + $preparing = []; + $prepared = []; + $events->listen(PreparingResponse::class, function ($event) use (&$preparing) { + $preparing[] = $event; + }); + $events->listen(ResponsePrepared::class, function ($event) use (&$prepared) { + $prepared[] = $event; + }); $container = new Container; + $container->instance(Dispatcher::class, $events); + $router = $this->getRouter($container); + $router->get('foo/bar', function () { + return 'hello'; + }); + $request = Request::create('foo/bar', 'GET'); - $router = new Router(new Dispatcher, $container); + $response = $router->dispatch($request); + + $this->assertSame('hello', $response->getContent()); + $this->assertCount(2, $preparing); + $this->assertSame($request, $preparing[0]->request); + $this->assertSame('hello', $preparing[0]->response); + $this->assertSame($request, $preparing[1]->request); + $this->assertSame($response, $preparing[1]->response); + $this->assertCount(2, $prepared); + $this->assertSame($request, $prepared[0]->request); + $this->assertSame($response, $prepared[0]->response); + $this->assertSame($request, $prepared[1]->request); + $this->assertSame($response, $prepared[1]->response); + } + + protected function getRouter($container = null) + { + $container ??= new Container; + + $router = new Router($container->make(Dispatcher::class), $container); $container->singleton(Registrar::class, function () use ($router) { return $router;