From 585216a8e8f38380a9c7a65f97fd899798ed4001 Mon Sep 17 00:00:00 2001 From: Robin Chalas Date: Sat, 16 Nov 2019 13:02:38 +0100 Subject: [PATCH] [HttpKernel] Flatten "exception" controller argument if not typed --- .../EventListener/ErrorListener.php | 2 +- .../Tests/EventListener/ErrorListenerTest.php | 28 +++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php index d8152edd22..77da3ce3e7 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php @@ -99,7 +99,7 @@ class ErrorListener implements EventSubscriberInterface $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 ae7149199f..cdf6874f35 100644 --- a/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/EventListener/ErrorListenerTest.php @@ -13,8 +13,8 @@ namespace Symfony\Component\HttpKernel\Tests\EventListener; 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 @@ class ErrorListenerTest extends TestCase $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 @@ class ErrorListenerTest extends TestCase $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