From d3f11218853b54771e695e49ff5768d5676c554e Mon Sep 17 00:00:00 2001 From: Yonel Ceruto Date: Tue, 12 Nov 2019 08:42:17 -0500 Subject: [PATCH] [TwigBundle] Restore the preview mechanism --- .../Twig/ErrorRenderer/TwigErrorRenderer.php | 24 +++++++++++++++++-- .../TwigBundle/Resources/config/twig.xml | 8 ++++++- .../ErrorHandler/Tests/ErrorHandlerTest.php | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bridge/Twig/ErrorRenderer/TwigErrorRenderer.php b/src/Symfony/Bridge/Twig/ErrorRenderer/TwigErrorRenderer.php index 9968b8ba8f..93fe767062 100644 --- a/src/Symfony/Bridge/Twig/ErrorRenderer/TwigErrorRenderer.php +++ b/src/Symfony/Bridge/Twig/ErrorRenderer/TwigErrorRenderer.php @@ -14,6 +14,7 @@ namespace Symfony\Bridge\Twig\ErrorRenderer; use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface; use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; use Symfony\Component\ErrorHandler\Exception\FlattenException; +use Symfony\Component\HttpFoundation\RequestStack; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Loader\ExistsLoaderInterface; @@ -30,8 +31,15 @@ class TwigErrorRenderer implements ErrorRendererInterface private $fallbackErrorRenderer; private $debug; - public function __construct(Environment $twig, HtmlErrorRenderer $fallbackErrorRenderer = null, bool $debug = false) + /** + * @param bool|callable $debug The debugging mode as a boolean or a callable that should return it + */ + public function __construct(Environment $twig, HtmlErrorRenderer $fallbackErrorRenderer = null, $debug = false) { + if (!\is_bool($debug) && !\is_callable($debug)) { + throw new \TypeError(sprintf('Argument 2 passed to %s() must be a boolean or a callable, %s given.', __METHOD__, \is_object($debug) ? \get_class($debug) : \gettype($debug))); + } + $this->twig = $twig; $this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer(); $this->debug = $debug; @@ -43,8 +51,9 @@ class TwigErrorRenderer implements ErrorRendererInterface public function render(\Throwable $exception): FlattenException { $exception = $this->fallbackErrorRenderer->render($exception); + $debug = \is_bool($this->debug) ? $this->debug : ($this->debug)($exception); - if ($this->debug || !$template = $this->findTemplate($exception->getStatusCode())) { + if ($debug || !$template = $this->findTemplate($exception->getStatusCode())) { return $exception; } @@ -56,6 +65,17 @@ class TwigErrorRenderer implements ErrorRendererInterface ])); } + public static function isDebug(RequestStack $requestStack, bool $debug): \Closure + { + return static function () use ($requestStack, $debug): bool { + if (!$request = $requestStack->getCurrentRequest()) { + return $debug; + } + + return $debug && $request->attributes->getBoolean('showException', true); + }; + } + private function findTemplate(int $statusCode): ?string { $template = sprintf('@Twig/Exception/error%s.html.twig', $statusCode); diff --git a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml index 425acdadef..9a7dc42e77 100644 --- a/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml +++ b/src/Symfony/Bundle/TwigBundle/Resources/config/twig.xml @@ -165,7 +165,13 @@ - %kernel.debug% + + + + + %kernel.debug% + + diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php index 907294cd77..747dbb72db 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php @@ -550,7 +550,7 @@ class ErrorHandlerTest extends TestCase $handler->handleException(new \Exception()); } - public function testSendPhpResponse() + public function testRenderException() { $handler = new ErrorHandler(); $handler->setExceptionHandler([$handler, 'renderException']);