From e900eea69e0a6623235d027a5da48cedc12c4c22 Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Sun, 10 Nov 2019 13:52:50 -0500 Subject: [PATCH] [ErrorHandler] help finish the PR --- .../Resources/config/error_renderer.xml | 6 ++- .../ErrorRenderer/TwigHtmlErrorRenderer.php | 2 +- .../DependencyInjection/TwigExtensionTest.php | 2 + .../TwigHtmlErrorRendererTest.php | 15 ++----- .../WebProfilerExtensionTest.php | 2 +- .../Component/ErrorHandler/ErrorHandler.php | 17 ++++++-- .../ErrorRenderer/CliErrorRenderer.php | 2 +- .../ErrorRenderer/HtmlErrorRenderer.php | 6 +-- .../ErrorRenderer/SerializerErrorRenderer.php | 40 +++++++++++++----- .../ErrorHandler/Tests/ErrorHandlerTest.php | 41 +++++-------------- .../ErrorRenderer/HtmlErrorRendererTest.php | 6 +-- ...st.php => SerializerErrorRendererTest.php} | 31 ++++---------- .../Tests/phpt/exception_rethrown.phpt | 18 ++++---- .../Component/ErrorHandler/composer.json | 6 +-- .../HttpKernel/Controller/ErrorController.php | 4 +- .../EventListener/ErrorListener.php | 2 +- .../Tests/Controller/ErrorControllerTest.php | 17 ++++---- 17 files changed, 106 insertions(+), 111 deletions(-) rename src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/{ErrorRendererTest.php => SerializerErrorRendererTest.php} (56%) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/error_renderer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/error_renderer.xml index d072f6b22714a..d0f7f85bbac86 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/error_renderer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/error_renderer.xml @@ -16,9 +16,11 @@ - + + + + - %kernel.debug% diff --git a/src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php b/src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php index 1fae5eadd71b9..e165ba7ded1c3 100644 --- a/src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php +++ b/src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php @@ -44,7 +44,7 @@ public function render(\Throwable $exception): FlattenException { $exception = $this->htmlErrorRenderer->render($exception); - if ($this->debug || !$template = $this->findTemplate($exception->getStatusCode()); + if ($this->debug || !$template = $this->findTemplate($exception->getStatusCode())) { return $exception; } diff --git a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php index 01abbd166715d..1a991ba694904 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/DependencyInjection/TwigExtensionTest.php @@ -23,6 +23,7 @@ use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; class TwigExtensionTest extends TestCase { @@ -302,6 +303,7 @@ public function testRuntimeLoader() $container->register('templating.locator', 'FooClass'); $container->register('templating.name_parser', 'FooClass'); $container->register('foo', '%foo%')->addTag('twig.runtime'); + $container->register('error_renderer.html', HtmlErrorRenderer::class); $container->addCompilerPass(new RuntimeLoaderPass(), PassConfig::TYPE_BEFORE_REMOVING); $container->getCompilerPassConfig()->setRemovingPasses([]); $container->getCompilerPassConfig()->setAfterRemovingPasses([]); diff --git a/src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php b/src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php index 1d5841ae190d7..3e17366725742 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php @@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Bundle\TwigBundle\ErrorRenderer\TwigHtmlErrorRenderer; use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; +use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Twig\Environment; use Twig\Loader\ArrayLoader; @@ -46,6 +47,7 @@ public function testFallbackToNativeRendererIfCustomTemplateNotFound() ->expects($this->once()) ->method('render') ->with($exception) + ->willReturn(FlattenException::createFromThrowable($exception)) ; (new TwigHtmlErrorRenderer($twig, $nativeRenderer, false))->render($exception); @@ -53,20 +55,11 @@ public function testFallbackToNativeRendererIfCustomTemplateNotFound() public function testRenderCustomErrorTemplate() { - $exception = new NotFoundHttpException(); - $twig = new Environment(new ArrayLoader([ '@Twig/Exception/error404.html.twig' => '

Page Not Found

', ])); + $exception = (new TwigHtmlErrorRenderer($twig, new HtmlErrorRenderer()))->render(new NotFoundHttpException()); - $nativeRenderer = $this->createMock(HtmlErrorRenderer::class); - $nativeRenderer - ->expects($this->never()) - ->method('render') - ; - - $content = (new TwigHtmlErrorRenderer($twig, $nativeRenderer, false))->render($exception); - - $this->assertSame('

Page Not Found

', $content->getAsString()); + $this->assertSame('

Page Not Found

', $exception->getAsString()); } } diff --git a/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php b/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php index e9bffb4d06a37..b94ef8045b684 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php +++ b/src/Symfony/Bundle/WebProfilerBundle/Tests/DependencyInjection/WebProfilerExtensionTest.php @@ -54,7 +54,7 @@ protected function setUp(): void $this->kernel = $this->getMockBuilder('Symfony\\Component\\HttpKernel\\KernelInterface')->getMock(); $this->container = new ContainerBuilder(); - $this->container->register('error_renderer.html', HtmlErrorRenderer::class)->setPublic(true); + $this->container->register('error_handler.error_renderer.html', HtmlErrorRenderer::class)->setPublic(true); $this->container->register('event_dispatcher', EventDispatcher::class)->setPublic(true); $this->container->register('router', $this->getMockClass('Symfony\\Component\\Routing\\RouterInterface'))->setPublic(true); $this->container->register('twig', 'Twig\Environment')->setPublic(true); diff --git a/src/Symfony/Component/ErrorHandler/ErrorHandler.php b/src/Symfony/Component/ErrorHandler/ErrorHandler.php index 8144f0de669e2..adb374e966d20 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorHandler.php +++ b/src/Symfony/Component/ErrorHandler/ErrorHandler.php @@ -21,7 +21,6 @@ use Symfony\Component\ErrorHandler\ErrorEnhancer\UndefinedMethodErrorEnhancer; use Symfony\Component\ErrorHandler\ErrorRenderer\CliErrorRenderer; use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; -use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; /** @@ -580,7 +579,12 @@ public function handleException(\Throwable $exception) } $exceptionHandler = $this->exceptionHandler; - $this->exceptionHandler = null; + $this->exceptionHandler = [$this, 'renderException']; + + if (null === $exceptionHandler || $exceptionHandler === $this->exceptionHandler){ + $this->exceptionHandler = null; + } + try { if (null !== $exceptionHandler) { return $exceptionHandler($exception); @@ -593,7 +597,14 @@ public function handleException(\Throwable $exception) throw $exception; // Give back $exception to the native handler } - $this->handleException($handlerException); + $loggedErrors = $this->loggedErrors; + $this->loggedErrors = $exception === $handlerException ? 0 : $this->loggedErrors; + + try { + $this->handleException($handlerException); + } finally { + $this->loggedErrors = $loggedErrors; + } } /** diff --git a/src/Symfony/Component/ErrorHandler/ErrorRenderer/CliErrorRenderer.php b/src/Symfony/Component/ErrorHandler/ErrorRenderer/CliErrorRenderer.php index fbe0b5bb234c7..aa132d1cfaccb 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorRenderer/CliErrorRenderer.php +++ b/src/Symfony/Component/ErrorHandler/ErrorRenderer/CliErrorRenderer.php @@ -30,7 +30,7 @@ public function render(\Throwable $exception): FlattenException protected function supportsColors(): bool { $outputStream = $this->outputStream; - $this->outputStream = STDOUT; + $this->outputStream = fopen('php://stdout', 'w'); try { return parent::supportsColors(); diff --git a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php index 92eeba2cf047e..68a9d6bb14dc6 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php +++ b/src/Symfony/Component/ErrorHandler/ErrorRenderer/HtmlErrorRenderer.php @@ -102,13 +102,13 @@ private function renderException(FlattenException $exception, string $debugTempl 'statusText' => $statusText, 'statusCode' => $statusCode, 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null, - 'currentContent' => $request ? $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level')) : '', + 'currentContent' => $request ? $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1)) : '', ]); } - private function getAndCleanOutputBuffering(?int $startObLevel): string + private function getAndCleanOutputBuffering(int $startObLevel): string { - if (null === $startObLevel || ob_get_level() <= $startObLevel) { + if (ob_get_level() <= $startObLevel) { return ''; } diff --git a/src/Symfony/Component/ErrorHandler/ErrorRenderer/SerializerErrorRenderer.php b/src/Symfony/Component/ErrorHandler/ErrorRenderer/SerializerErrorRenderer.php index 2485ee3f3a203..d0fdc8d0b664f 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorRenderer/SerializerErrorRenderer.php +++ b/src/Symfony/Component/ErrorHandler/ErrorRenderer/SerializerErrorRenderer.php @@ -11,7 +11,8 @@ namespace Symfony\Component\ErrorHandler\ErrorRenderer; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Serializer\Exception\NotEncodableValueException; use Symfony\Component\Serializer\SerializerInterface; @@ -20,17 +21,24 @@ * * @author Nicolas Grekas */ -class SerializerErrorRenderer +class SerializerErrorRenderer implements ErrorRendererInterface { private $serializer; - private $requestStack; - private $debug; + private $format; + private $fallbackErrorRenderer; - public function __construct(SerializerInterface $serializer, RequestStack $requestStack, bool $debug = true) + /** + * @param string|callable $format The format as a string or a callable that should return it + */ + public function __construct(SerializerInterface $serializer, $format, ErrorRendererInterface $fallbackErrorRenderer = null) { + if (!\is_string($format) && !\is_callable($format)) { + throw new \TypeError(sprintf('Argument 2 passed to %s() must be a string or a callable, %s given.', __METHOD__, \is_object($format) ? \get_class($format) : \gettype($format))); + } + $this->serializer = $serializer; - $this->requestStack = $requestStack; - $this->debug = $debug; + $this->format = $format; + $this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer(); } /** @@ -38,13 +46,25 @@ public function __construct(SerializerInterface $serializer, RequestStack $reque */ public function render(\Throwable $exception): FlattenException { - $format = $this->requestStack->getCurrentRequest()->getPreferredFormat(); $flattenException = FlattenException::createFromThrowable($exception); try { + $format = \is_string($this->format) ? $this->format : ($this->format)(); + return $flattenException->setAsString($this->serializer->serialize($flattenException, $format, ['exception' => $exception])); - } catch (NotEncodableValueException $_) { - return (new HtmlErrorHandler($this->debug))->render($exception); + } catch (NotEncodableValueException $e) { + return $this->fallbackErrorRenderer->render($exception); } } + + public static function getPreferredFormat(RequestStack $requestStack): \Closure + { + return static function () use ($requestStack) { + if (!$request = $requestStack->getCurrentRequest()) { + throw new NotEncodableValueException(); + } + + return $request->getPreferredFormat(); + }; + } } diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php index 1c170732e8983..907294cd770b8 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php @@ -50,23 +50,13 @@ public function testRegister() $h = set_error_handler('var_dump'); restore_error_handler(); $this->assertSame([$newHandler, 'handleError'], $h); - } catch (\Exception $e) { + } finally { + restore_error_handler(); + restore_exception_handler(); } - + } finally { restore_error_handler(); restore_exception_handler(); - - if (isset($e)) { - throw $e; - } - } catch (\Exception $e) { - } - - restore_error_handler(); - restore_exception_handler(); - - if (isset($e)) { - throw $e; } } @@ -86,11 +76,9 @@ public function testErrorGetLast() 'line' => __LINE__ - 5, ]; $this->assertSame($expected, error_get_last()); - } catch (\Exception $e) { + } finally { restore_error_handler(); restore_exception_handler(); - - throw $e; } } @@ -323,14 +311,9 @@ public function testHandleError() unset($undefVar); $line = __LINE__ + 1; @$undefVar++; - - restore_error_handler(); - restore_exception_handler(); - } catch (\Exception $e) { + } finally { restore_error_handler(); restore_exception_handler(); - - throw $e; } } @@ -406,6 +389,7 @@ public function testHandleException(string $expectedMessage, \Throwable $excepti ; $handler->setDefaultLogger($logger, E_ERROR); + $handler->setExceptionHandler(null); try { $handler->handleException($exception); @@ -530,16 +514,12 @@ public function testHandleFatalError() ; $handler->setDefaultLogger($logger, E_PARSE); + $handler->setExceptionHandler(null); $handler->handleFatalError($error); - - restore_error_handler(); - restore_exception_handler(); - } catch (\Exception $e) { + } finally { restore_error_handler(); restore_exception_handler(); - - throw $e; } } @@ -563,6 +543,7 @@ public function testCustomExceptionHandler() $this->expectException('Exception'); $handler = new ErrorHandler(); $handler->setExceptionHandler(function ($e) use ($handler) { + $handler->setExceptionHandler(null); $handler->handleException($e); }); @@ -572,7 +553,7 @@ public function testCustomExceptionHandler() public function testSendPhpResponse() { $handler = new ErrorHandler(); - $handler->setExceptionHandler([$handler, 'sendPhpResponse']); + $handler->setExceptionHandler([$handler, 'renderException']); ob_start(); $handler->handleException(new \RuntimeException('Class Foo not found')); diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/HtmlErrorRendererTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/HtmlErrorRendererTest.php index e2b81f20e5fbe..b140ca6e52f74 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/HtmlErrorRendererTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/HtmlErrorRendererTest.php @@ -20,7 +20,7 @@ class HtmlErrorRendererTest extends TestCase /** * @dataProvider getRenderData */ - public function testRender(FlattenException $exception, HtmlErrorRenderer $errorRenderer, string $expected) + public function testRender(\Throwable $exception, HtmlErrorRenderer $errorRenderer, string $expected) { $this->assertStringMatchesFormat($expected, $errorRenderer->render($exception)->getAsString()); } @@ -44,13 +44,13 @@ public function getRenderData(): iterable HTML; yield '->render() returns the HTML content WITH stack traces in debug mode' => [ - FlattenException::createFromThrowable(new \RuntimeException('Foo')), + new \RuntimeException('Foo'), new HtmlErrorRenderer(true), $expectedDebug, ]; yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode' => [ - FlattenException::createFromThrowable(new \RuntimeException('Foo')), + new \RuntimeException('Foo'), new HtmlErrorRenderer(false), $expectedNonDebug, ]; diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/ErrorRendererTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/SerializerErrorRendererTest.php similarity index 56% rename from src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/ErrorRendererTest.php rename to src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/SerializerErrorRendererTest.php index 6ac134b7935fd..a1698e0a88cd9 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/ErrorRendererTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorRenderer/SerializerErrorRendererTest.php @@ -12,42 +12,29 @@ namespace Symfony\Component\ErrorHandler\Tests\ErrorRenderer; use PHPUnit\Framework\TestCase; -use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRenderer; -use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRendererInterface; +use Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer; use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Normalizer\ProblemNormalizer; use Symfony\Component\Serializer\Serializer; -class ErrorRendererTest extends TestCase +class SerializerErrorRendererTest extends TestCase { public function testDefaultContent() { - $errorRenderer = new ErrorRenderer(); + $errorRenderer = new SerializerErrorRenderer(new Serializer(), 'html'); - self::assertStringContainsString('

The server returned a "500 Internal Server Error".

', $errorRenderer->render(new \RuntimeException(), 'html')); - } - - public function testCustomContent() - { - $errorRenderer = new ErrorRenderer(new CustomHtmlErrorRenderer()); - - $this->assertSame('Foo', $errorRenderer->render(new \RuntimeException('Foo'), 'html')); + self::assertStringContainsString('

The server returned a "500 Internal Server Error".

', $errorRenderer->render(new \RuntimeException())->getAsString()); } public function testSerializerContent() { $exception = new \RuntimeException('Foo'); - $errorRenderer = new ErrorRenderer(null, new Serializer([new ProblemNormalizer()], [new JsonEncoder()])); + $errorRenderer = new SerializerErrorRenderer( + new Serializer([new ProblemNormalizer()], [new JsonEncoder()]), + function () { return 'json'; } + ); - $this->assertSame('{"type":"https:\/\/tools.ietf.org\/html\/rfc2616#section-10","title":"An error occurred","status":500,"detail":"Internal Server Error"}', $errorRenderer->render($exception, 'json')); - } -} - -class CustomHtmlErrorRenderer implements HtmlErrorRendererInterface -{ - public function render(FlattenException $exception): string - { - return $exception->getMessage(); + $this->assertSame('{"type":"https:\/\/tools.ietf.org\/html\/rfc2616#section-10","title":"An error occurred","status":500,"detail":"Internal Server Error"}', $errorRenderer->render($exception)->getAsString()); } } diff --git a/src/Symfony/Component/ErrorHandler/Tests/phpt/exception_rethrown.phpt b/src/Symfony/Component/ErrorHandler/Tests/phpt/exception_rethrown.phpt index 82a9006d840f9..fb6c17bcaf01a 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/phpt/exception_rethrown.phpt +++ b/src/Symfony/Component/ErrorHandler/Tests/phpt/exception_rethrown.phpt @@ -16,20 +16,22 @@ if (true) { { public function log($level, $message, array $context = []) { - echo $message, "\n"; + echo 'LOG: ', $message, "\n"; } } } -set_exception_handler(function ($e) { echo 123; throw $e; }); +set_exception_handler(function ($e) { echo "EHLO\n"; throw $e; }); ErrorHandler::register()->setDefaultLogger(new TestLogger()); -ini_set('display_errors', 1); throw new \Exception('foo'); ?> --EXPECTF-- -Uncaught Exception: foo -123 -Fatal error: Uncaught %s:25 -Stack trace: -%a +LOG: Uncaught Exception: foo +EHLO +Exception {#%d + #message: "foo" + #code: 0 + #file: "Standard input code" + #line: 24 +} diff --git a/src/Symfony/Component/ErrorHandler/composer.json b/src/Symfony/Component/ErrorHandler/composer.json index bbde24ad913f6..cfe822f4e8b39 100644 --- a/src/Symfony/Component/ErrorHandler/composer.json +++ b/src/Symfony/Component/ErrorHandler/composer.json @@ -22,10 +22,8 @@ "symfony/var-dumper": "^4.4|^5.0" }, "require-dev": { - "symfony/http-kernel": "^4.4|^5.0" - }, - "conflict": { - "symfony/http-kernel": "<4.4" + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" }, "autoload": { "psr-4": { "Symfony\\Component\\ErrorHandler\\": "" }, diff --git a/src/Symfony/Component/HttpKernel/Controller/ErrorController.php b/src/Symfony/Component/HttpKernel/Controller/ErrorController.php index 3e5447928b5b4..b6c440103ffd3 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ErrorController.php +++ b/src/Symfony/Component/HttpKernel/Controller/ErrorController.php @@ -12,9 +12,9 @@ namespace Symfony\Component\HttpKernel\Controller; use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface; -use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\HttpKernelInterface; /** @@ -52,7 +52,7 @@ public function preview(Request $request, int $code): Response */ $subRequest = $request->duplicate(null, null, [ '_controller' => $this->controller, - 'exception' => new \Exception('This is a sample exception.'), + 'exception' => new HttpException($code, 'This is a sample exception.'), 'logger' => null, 'showException' => false, ]); diff --git a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php index fa3300b73e7e4..a7f0d24e41dce 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ErrorListener.php @@ -12,7 +12,7 @@ namespace Symfony\Component\HttpKernel\EventListener; use Psr\Log\LoggerInterface; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php index 7548dc19e46d6..a857615f1c3d3 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\HttpKernel\Tests\Controller; use PHPUnit\Framework\TestCase; -use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRenderer; use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; @@ -27,12 +26,12 @@ class ErrorControllerTest extends TestCase /** * @dataProvider getInvokeControllerDataProvider */ - public function testInvokeController(Request $request, FlattenException $exception, int $statusCode, string $content) + public function testInvokeController(Request $request, \Exception $exception, int $statusCode, string $content) { $kernel = $this->getMockBuilder(HttpKernelInterface::class)->getMock(); - $errorRenderer = new ErrorRenderer(new HtmlErrorRenderer()); + $errorRenderer = new HtmlErrorRenderer(); $controller = new ErrorController($kernel, null, $errorRenderer); - $response = $controller($request, $exception); + $response = $controller($exception); $this->assertSame($statusCode, $response->getStatusCode()); self::assertStringContainsString($content, strtr($response->getContent(), ["\n" => '', ' ' => ''])); @@ -42,14 +41,14 @@ public function getInvokeControllerDataProvider() { yield 'default status code and HTML format' => [ new Request(), - FlattenException::createFromThrowable(new \Exception()), + new \Exception(), 500, 'The server returned a "500 Internal Server Error".', ]; yield 'custom status code' => [ new Request(), - FlattenException::createFromThrowable(new NotFoundHttpException('Page not found.')), + new NotFoundHttpException('Page not found.'), 404, 'The server returned a "404 Not Found".', ]; @@ -58,7 +57,7 @@ public function getInvokeControllerDataProvider() $request->attributes->set('_format', 'unknown'); yield 'default HTML format for unknown formats' => [ $request, - FlattenException::createFromThrowable(new HttpException(405, 'Invalid request.')), + new HttpException(405, 'Invalid request.'), 405, 'The server returned a "405 Method Not Allowed".', ]; @@ -78,7 +77,7 @@ public function testPreviewController() $exception = $request->attributes->get('exception'); $this->assertSame($_controller, $request->attributes->get('_controller')); - $this->assertInstanceOf(FlattenException::class, $exception); + $this->assertInstanceOf(\Throwable::class, $exception); $this->assertSame($code, $exception->getStatusCode()); $this->assertFalse($request->attributes->get('showException')); @@ -88,7 +87,7 @@ public function testPreviewController() ) ->willReturn($response = new Response()); - $controller = new ErrorController($kernel, $_controller, new ErrorRenderer()); + $controller = new ErrorController($kernel, $_controller, new HtmlErrorRenderer()); $this->assertSame($response, $controller->preview(new Request(), $code)); }