diff --git a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php index d8152edd22de..77da3ce3e7a8 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php @@ -99,7 +99,7 @@ public function onControllerArguments(ControllerArgumentsEvent $event) $r = new \ReflectionFunction(\Closure::fromCallable($event->getController())); $r = $r->getParameters()[$k] ?? null; - if ($r && $r->hasType() && FlattenException::class === $r->getType()->getName()) { + if ($r && (!$r->hasType() || FlattenException::class === $r->getType()->getName())) { $arguments = $event->getArguments(); $arguments[$k] = FlattenException::createFromThrowable($e); $event->setArguments($arguments); diff --git a/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php b/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php index ae7149199f96..cdf6874f359b 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php @@ -13,8 +13,8 @@ use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; -use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; @@ -158,12 +158,11 @@ public function testCSPHeaderIsRemoved() $this->assertFalse($dispatcher->hasListeners(KernelEvents::RESPONSE), 'CSP removal listener has been removed'); } - public function testOnControllerArguments() + /** + * @dataProvider controllerProvider + */ + public function testOnControllerArguments(callable $controller) { - $controller = function (FlattenException $exception) { - return new Response('OK: '.$exception->getMessage()); - }; - $listener = new ErrorListener($controller, $this->createMock(LoggerInterface::class), true); $kernel = $this->createMock(HttpKernelInterface::class); @@ -181,6 +180,23 @@ public function testOnControllerArguments() $this->assertSame('OK: foo', $event->getResponse()->getContent()); } + + public function controllerProvider() + { + yield [function (FlattenException $exception) { + return new Response('OK: '.$exception->getMessage()); + }]; + + yield [function ($exception) { + $this->assertInstanceOf(FlattenException::class, $exception); + + return new Response('OK: '.$exception->getMessage()); + }]; + + yield [function (\Throwable $exception) { + return new Response('OK: '.$exception->getMessage()); + }]; + } } class TestLogger extends Logger implements DebugLoggerInterface