diff --git a/UPGRADE-4.4.md b/UPGRADE-4.4.md index db46529072..dfbad35a97 100644 --- a/UPGRADE-4.4.md +++ b/UPGRADE-4.4.md @@ -155,6 +155,33 @@ HttpKernel current directory or with a glob pattern. The fallback directories have never been advocated so you likely do not use those in any app based on the SF Standard or Flex edition. * Getting the container from a non-booted kernel is deprecated + * Deprecated passing the `exception` attribute (instance of `Symfony\Component\Debug\Exception\FlattenException`) + to the configured controller of the `ExceptionListener`, use the `e` attribute + (instance of `Symfony\Component\ErrorRenderer\Exception\FlattenException`) instead + + before: + ```php + use Symfony\Component\Debug\Exception\FlattenException; + + class ExceptionController + { + public function __invoke(FlattenException $exception) + { + } + } + ``` + + after: + ```php + use Symfony\Component\ErrorRenderer\Exception\FlattenException; + + class ExceptionController + { + public function __invoke(FlattenException $e) + { + } + } + ``` Lock ---- diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md index a9c1e711e4..f7fbd19e82 100644 --- a/UPGRADE-5.0.md +++ b/UPGRADE-5.0.md @@ -341,6 +341,33 @@ HttpKernel * Removed the second and third argument of `FileLocator::__construct` * Removed loading resources from `%kernel.root_dir%/Resources` and `%kernel.root_dir%` as fallback directories. + * Removed passing the `exception` attribute (instance of `Symfony\Component\Debug\Exception\FlattenException`) + to the configured controller of the `ExceptionListener`, use the `e` attribute + (instance of `Symfony\Component\ErrorRenderer\Exception\FlattenException`) instead + + before: + ```php + use Symfony\Component\Debug\Exception\FlattenException; + + class ExceptionController + { + public function __invoke(FlattenException $exception) + { + } + } + ``` + + after: + ```php + use Symfony\Component\ErrorRenderer\Exception\FlattenException; + + class ExceptionController + { + public function __invoke(FlattenException $e) + { + } + } + ``` Intl ---- diff --git a/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php b/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php index a2458f1818..c679d9a772 100644 --- a/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php +++ b/src/Symfony/Bundle/TwigBundle/Controller/ExceptionController.php @@ -11,7 +11,7 @@ namespace Symfony\Bundle\TwigBundle\Controller; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; diff --git a/src/Symfony/Bundle/TwigBundle/Controller/PreviewErrorController.php b/src/Symfony/Bundle/TwigBundle/Controller/PreviewErrorController.php index 7e82c3e68a..970e7f031c 100644 --- a/src/Symfony/Bundle/TwigBundle/Controller/PreviewErrorController.php +++ b/src/Symfony/Bundle/TwigBundle/Controller/PreviewErrorController.php @@ -11,7 +11,7 @@ namespace Symfony\Bundle\TwigBundle\Controller; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\HttpKernelInterface; diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php b/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php index 4e48df0aeb..8665411796 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/Controller/ExceptionControllerTest.php @@ -13,7 +13,7 @@ namespace Symfony\Bundle\TwigBundle\Tests\Controller; use Symfony\Bundle\TwigBundle\Controller\ExceptionController; use Symfony\Bundle\TwigBundle\Tests\TestCase; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; use Twig\Environment; use Twig\Loader\ArrayLoader; diff --git a/src/Symfony/Bundle/TwigBundle/Tests/Controller/PreviewErrorControllerTest.php b/src/Symfony/Bundle/TwigBundle/Tests/Controller/PreviewErrorControllerTest.php index 0178276ee5..63750cd2ab 100644 --- a/src/Symfony/Bundle/TwigBundle/Tests/Controller/PreviewErrorControllerTest.php +++ b/src/Symfony/Bundle/TwigBundle/Tests/Controller/PreviewErrorControllerTest.php @@ -13,7 +13,7 @@ namespace Symfony\Bundle\TwigBundle\Tests\Controller; use Symfony\Bundle\TwigBundle\Controller\PreviewErrorController; use Symfony\Bundle\TwigBundle\Tests\TestCase; -use Symfony\Component\ErrorRenderer\Exception\FlattenException; +use Symfony\Component\Debug\Exception\FlattenException; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\HttpKernelInterface; diff --git a/src/Symfony/Component/ErrorRenderer/Exception/FlattenException.php b/src/Symfony/Component/ErrorRenderer/Exception/FlattenException.php index 56a5221ed8..eb544d935f 100644 --- a/src/Symfony/Component/ErrorRenderer/Exception/FlattenException.php +++ b/src/Symfony/Component/ErrorRenderer/Exception/FlattenException.php @@ -22,6 +22,8 @@ use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; * Basically, this class removes all objects from the trace. * * @author Fabien Potencier + * + * @internal */ class FlattenException { @@ -37,6 +39,11 @@ class FlattenException private $file; private $line; + public static function create(\Exception $exception, int $statusCode = null, array $headers = []): self + { + return static::createFromThrowable($exception, $statusCode, $headers); + } + public static function createFromThrowable(\Throwable $exception, int $statusCode = null, array $headers = []): self { $e = new static(); @@ -374,18 +381,3 @@ class FlattenException return rtrim($message); } } - -namespace Symfony\Component\Debug\Exception; - -if (!class_exists(FlattenException::class, false)) { - class_alias(\Symfony\Component\ErrorRenderer\Exception\FlattenException::class, FlattenException::class); -} - -if (false) { - /** - * @deprecated since Symfony 4.4, use Symfony\Component\ErrorRenderer\Exception\FlattenException instead. - */ - class FlattenException extends \Symfony\Component\ErrorRenderer\Exception\FlattenException - { - } -} diff --git a/src/Symfony/Component/ErrorRenderer/Resources/stubs/Exception/FlattenException.php b/src/Symfony/Component/ErrorRenderer/Resources/stubs/Exception/FlattenException.php new file mode 100644 index 0000000000..f17f5711a3 --- /dev/null +++ b/src/Symfony/Component/ErrorRenderer/Resources/stubs/Exception/FlattenException.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Debug\Exception; + +if (!class_exists(FlattenException::class, false)) { + class_alias(\Symfony\Component\ErrorRenderer\Exception\FlattenException::class, FlattenException::class); +} + +if (false) { + /** + * @deprecated since Symfony 4.4, use Symfony\Component\ErrorRenderer\Exception\FlattenException instead. + */ + class FlattenException extends \Symfony\Component\ErrorRenderer\Exception\FlattenException + { + } +} diff --git a/src/Symfony/Component/ErrorRenderer/composer.json b/src/Symfony/Component/ErrorRenderer/composer.json index 804534aec6..61e052e536 100644 --- a/src/Symfony/Component/ErrorRenderer/composer.json +++ b/src/Symfony/Component/ErrorRenderer/composer.json @@ -33,6 +33,7 @@ }, "autoload": { "psr-4": { "Symfony\\Component\\ErrorRenderer\\": "" }, + "classmap": [ "Resources/stubs/Exception/FlattenException.php" ], "exclude-from-classmap": [ "/Tests/" ] diff --git a/src/Symfony/Component/HttpKernel/CHANGELOG.md b/src/Symfony/Component/HttpKernel/CHANGELOG.md index 6a11a170b3..f635698347 100644 --- a/src/Symfony/Component/HttpKernel/CHANGELOG.md +++ b/src/Symfony/Component/HttpKernel/CHANGELOG.md @@ -15,6 +15,8 @@ CHANGELOG * Marked all dispatched event classes as `@final` * Added `ErrorController` to enable the preview and error rendering mechanism * Getting the container from a non-booted kernel is deprecated. + * Deprecated passing the `exception` attribute (instance of `Symfony\Component\Debug\Exception\FlattenException`) + to the configured controller of the `ExceptionListener` 4.3.0 ----- diff --git a/src/Symfony/Component/HttpKernel/Controller/ErrorController.php b/src/Symfony/Component/HttpKernel/Controller/ErrorController.php index 3efa4e96dc..514ca597ee 100644 --- a/src/Symfony/Component/HttpKernel/Controller/ErrorController.php +++ b/src/Symfony/Component/HttpKernel/Controller/ErrorController.php @@ -37,12 +37,12 @@ class ErrorController $this->errorRenderer = $errorRenderer; } - public function __invoke(Request $request, FlattenException $exception): Response + public function __invoke(Request $request, FlattenException $e): Response { try { - return new Response($this->errorRenderer->render($exception, $request->getPreferredFormat()), $exception->getStatusCode(), $exception->getHeaders()); - } catch (ErrorRendererNotFoundException $e) { - return new Response($this->errorRenderer->render($exception), $exception->getStatusCode(), $exception->getHeaders()); + return new Response($this->errorRenderer->render($e, $request->getPreferredFormat()), $e->getStatusCode(), $e->getHeaders()); + } catch (ErrorRendererNotFoundException $_) { + return new Response($this->errorRenderer->render($e), $e->getStatusCode(), $e->getHeaders()); } } @@ -57,7 +57,7 @@ class ErrorController */ $subRequest = $request->duplicate(null, null, [ '_controller' => $this->controller, - 'exception' => $exception, + 'e' => $exception, 'logger' => null, 'showException' => false, ]); diff --git a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php index ae64374c6e..0c8c871e67 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/ExceptionListener.php @@ -12,6 +12,7 @@ namespace Symfony\Component\HttpKernel\EventListener; use Psr\Log\LoggerInterface; +use Symfony\Component\Debug\Exception\FlattenException as LegacyFlattenException; use Symfony\Component\ErrorRenderer\Exception\FlattenException; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -123,9 +124,21 @@ class ExceptionListener implements EventSubscriberInterface */ protected function duplicateRequest(\Exception $exception, Request $request) { + @trigger_error(sprintf('Passing the "exception" attribute (instance of "%s") to the configured controller of the "%s" class is deprecated since Symfony 4.4, use the passed "e" attribute (instance of "%s") instead.', LegacyFlattenException::class, self::class, FlattenException::class)); + + $flattenException = FlattenException::createFromThrowable($exception); + + // BC layer to be removed in 5.0 + if (class_exists(\Symfony\Component\Debug\Debug::class, false)) { + $legacyFlattenException = LegacyFlattenException::createFromThrowable($exception); + } else { + $legacyFlattenException = $flattenException; + } + $attributes = [ '_controller' => $this->controller, - 'exception' => FlattenException::createFromThrowable($exception), + 'exception' => $legacyFlattenException, // to be removed in 5.0 + 'e' => $flattenException, 'logger' => $this->logger instanceof DebugLoggerInterface ? $this->logger : null, ]; $request = $request->duplicate(null, null, $attributes); diff --git a/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php b/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php index bc37a0e15e..9f380732af 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Controller/ErrorControllerTest.php @@ -103,7 +103,7 @@ class ErrorControllerTest extends TestCase ->method('handle') ->with( $this->callback(function (Request $request) use ($_controller, $code) { - $exception = $request->attributes->get('exception'); + $exception = $request->attributes->get('e'); $this->assertSame($_controller, $request->attributes->get('_controller')); $this->assertInstanceOf(FlattenException::class, $exception);