diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bac5bb..a711c56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 4.2.1 under development -- no changes in this release. +- New #156: Pass request to callable value in `ExceptionResponder` middleware (@vjik) ## 4.2.0 August 19, 2025 diff --git a/src/Middleware/ExceptionResponder.php b/src/Middleware/ExceptionResponder.php index b912c44..7af60e9 100644 --- a/src/Middleware/ExceptionResponder.php +++ b/src/Middleware/ExceptionResponder.php @@ -78,7 +78,10 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface if (is_callable($responseHandler)) { /** @var ResponseInterface */ - return $this->injector->invoke($responseHandler, ['exception' => $t]); + return $this->injector->invoke($responseHandler, [ + 'exception' => $t, + 'request' => $request, + ]); } } } diff --git a/tests/Middleware/ExceptionResponderTest.php b/tests/Middleware/ExceptionResponderTest.php index 3d51e45..b669052 100644 --- a/tests/Middleware/ExceptionResponderTest.php +++ b/tests/Middleware/ExceptionResponderTest.php @@ -8,6 +8,7 @@ use HttpSoft\Message\Response; use HttpSoft\Message\ResponseFactory; use HttpSoft\Message\ResponseTrait; +use HttpSoft\Message\ServerRequest; use HttpSoft\Message\ServerRequestFactory; use InvalidArgumentException; use LogicException; @@ -41,18 +42,26 @@ public function testCode(): void public function testCallable(): void { + $request = new ServerRequest(headers: ['X-TEST' => ['HELLO']]); $middleware = $this->createMiddleware([ - DomainException::class => function (ResponseFactoryInterface $responseFactory) { - return $responseFactory->createResponse(Status::CREATED); - }, + DomainException::class => + static function (ResponseFactoryInterface $responseFactory, ServerRequestInterface $request) { + return $responseFactory->createResponse(Status::CREATED, $request->getHeaderLine('X-TEST')); + }, ]); - $this->assertSame( - Status::CREATED, - $this - ->process($middleware) - ->getStatusCode(), + $response = $middleware->process( + $request, + new class () implements RequestHandlerInterface { + public function handle(ServerRequestInterface $request): ResponseInterface + { + throw new DomainException(); + } + }, ); + + $this->assertSame(Status::CREATED, $response->getStatusCode()); + $this->assertSame('HELLO', $response->getReasonPhrase()); } public function testAnotherException(): void