Skip to content

Commit 0b867be

Browse files
committed
feature #34312 [ErrorHandler] merge and remove the ErrorRenderer component (nicolas-grekas, yceruto)
This PR was merged into the 4.4 branch. Discussion ---------- [ErrorHandler] merge and remove the ErrorRenderer component | Q | A | ------------- | --- | Branch? | 4.4 | Bug fix? | yes | New feature? | yes | Deprecations? | no | Tickets | - | License | MIT | Doc PR | - This PR supersedes #34288. Here is what it does: - Merge the `ErrorRenderer` component into `ErrorHandler` - Add `ErrorRendererInterface::render(\Throwable $e): FlattenException` and refactor error renderers around it. - Add `FlattenException::setAsString()` to make the previous possible. - Add `CliErrorRenderer` to render error on the CLI too. This means `VarDumper` is now a required dependency of `ErrorHandler`. This paves the way to use it also for rendering HTML - the logic there is much more advanced than what `HtmlErrorRenderer` provides and ever should provide. - Make `BufferingLogger` map its collected logs to `error_log()` if they are not emptied before. - Remove some classes that are not needed anymore (`ErrorRenderer`, `ErrorRendererPass`, `HtmlErrorRendererInterface`) - Simplified the logic in `Debug::enable()` - nobody uses its arguments - Fix a few issues found meanwhile. With these changes, the component can be used standalone. One is now able to require only it, register it either with either `ErrorHandler::register()` or `Debug::enable()` and profit. Commits ------- d1bf1ca [ErrorHandler] help finish the PR 6c9157b [ErrorHandler] merge and remove the ErrorRenderer component
2 parents 25c166f + d1bf1ca commit 0b867be

File tree

105 files changed

+650
-1709
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

105 files changed

+650
-1709
lines changed

UPGRADE-4.4.md

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ Console
1818
Debug
1919
-----
2020

21-
* Deprecated the `Debug` class, use the one from the `ErrorRenderer` component instead
22-
* Deprecated the `FlattenException` class, use the one from the `ErrorRenderer` component instead
2321
* Deprecated the component in favor of the `ErrorHandler` component
2422

2523
Config
@@ -306,48 +304,38 @@ TwigBundle
306304
```
307305

308306
* Deprecated the `ExceptionController` and `PreviewErrorController` controllers, use `ErrorController` from the HttpKernel component instead
309-
* Deprecated all built-in error templates, use the error renderer mechanism of the `ErrorRenderer` component
307+
* Deprecated all built-in error templates, use the error renderer mechanism of the `ErrorHandler` component
310308
* Deprecated loading custom error templates in non-html formats. Custom HTML error pages based on Twig keep working as before:
311309

312-
Before (`templates/bundles/TwigBundle/Exception/error.jsonld.twig`):
310+
Before (`templates/bundles/TwigBundle/Exception/error.json.twig`):
313311
```twig
314312
{
315-
"@id": "https://example.com",
316-
"@type": "error",
317-
"@context": {
318-
"title": "{{ status_text }}",
319-
"code": {{ status_code }},
320-
"message": "{{ exception.message }}"
321-
}
313+
"type": "https://example.com/error",
314+
"title": "{{ status_text }}",
315+
"status": {{ status_code }}
322316
}
323317
```
324318

325-
After (`App\ErrorRenderer\JsonLdErrorRenderer`):
319+
After (`App\Serializer\ProblemJsonNormalizer`):
326320
```php
327-
class JsonLdErrorRenderer implements ErrorRendererInterface
321+
class ProblemJsonNormalizer implements NormalizerInterface
328322
{
329-
public static function getFormat(): string
323+
public function normalize($exception, $format = null, array $context = [])
330324
{
331-
return 'jsonld';
325+
return [
326+
'type' => 'https://example.com/error',
327+
'title' => $exception->getStatusText(),
328+
'status' => $exception->getStatusCode(),
329+
];
332330
}
333331
334-
public function render(FlattenException $exception): string
332+
public function supportsNormalization($data, $format = null)
335333
{
336-
return json_encode([
337-
'@id' => 'https://example.com',
338-
'@type' => 'error',
339-
'@context' => [
340-
'title' => $exception->getTitle(),
341-
'code' => $exception->getStatusCode(),
342-
'message' => $exception->getMessage(),
343-
],
344-
]);
334+
return 'json' === $format && $data instanceof FlattenException;
345335
}
346336
}
347337
```
348338

349-
Configure your rendering service tagging it with `error_renderer.renderer`.
350-
351339
Validator
352340
---------
353341

UPGRADE-5.0.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ Console
5757
Debug
5858
-----
5959

60-
* Removed the `Debug` class, use the one from the `ErrorRenderer` component instead
61-
* Removed the `FlattenException` class, use the one from the `ErrorRenderer` component instead
6260
* Removed the component in favor of the `ErrorHandler` component
6361

6462
DependencyInjection

composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
"symfony/dom-crawler": "self.version",
4949
"symfony/dotenv": "self.version",
5050
"symfony/error-handler": "self.version",
51-
"symfony/error-renderer": "self.version",
5251
"symfony/event-dispatcher": "self.version",
5352
"symfony/expression-language": "self.version",
5453
"symfony/filesystem": "self.version",

src/Symfony/Bridge/Twig/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ CHANGELOG
44
4.4.0
55
-----
66

7+
* added a new `TwigErrorRenderer` for `html` format, integrated with the `ErrorHandler` component
78
* marked all classes extending twig as `@final`
89
* deprecated to pass `$rootDir` and `$fileLinkFormatter` as 5th and 6th argument respectively to the
910
`DebugCommand::__construct()` method, swap the variables position.

src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php renamed to src/Symfony/Bridge/Twig/ErrorRenderer/TwigErrorRenderer.php

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Bundle\TwigBundle\ErrorRenderer;
12+
namespace Symfony\Bridge\Twig\ErrorRenderer;
1313

14-
use Symfony\Component\ErrorRenderer\ErrorRenderer\ErrorRendererInterface;
15-
use Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer;
16-
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
14+
use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface;
15+
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
16+
use Symfony\Component\ErrorHandler\Exception\FlattenException;
1717
use Twig\Environment;
1818
use Twig\Error\LoaderError;
1919
use Twig\Loader\ExistsLoaderInterface;
@@ -24,50 +24,36 @@
2424
*
2525
* @author Yonel Ceruto <yonelceruto@gmail.com>
2626
*/
27-
class TwigHtmlErrorRenderer implements ErrorRendererInterface
27+
class TwigErrorRenderer implements ErrorRendererInterface
2828
{
2929
private $twig;
30-
private $htmlErrorRenderer;
30+
private $fallbackErrorRenderer;
3131
private $debug;
3232

33-
public function __construct(Environment $twig, HtmlErrorRenderer $htmlErrorRenderer, bool $debug = false)
33+
public function __construct(Environment $twig, HtmlErrorRenderer $fallbackErrorRenderer = null, bool $debug = false)
3434
{
3535
$this->twig = $twig;
36-
$this->htmlErrorRenderer = $htmlErrorRenderer;
36+
$this->fallbackErrorRenderer = $fallbackErrorRenderer ?? new HtmlErrorRenderer();
3737
$this->debug = $debug;
3838
}
3939

4040
/**
4141
* {@inheritdoc}
4242
*/
43-
public static function getFormat(): string
43+
public function render(\Throwable $exception): FlattenException
4444
{
45-
return 'html';
46-
}
47-
48-
/**
49-
* {@inheritdoc}
50-
*/
51-
public function render(FlattenException $exception): string
52-
{
53-
$debug = $this->debug && ($exception->getHeaders()['X-Debug'] ?? true);
54-
55-
if ($debug) {
56-
return $this->htmlErrorRenderer->render($exception);
57-
}
58-
59-
$template = $this->findTemplate($exception->getStatusCode());
45+
$exception = $this->fallbackErrorRenderer->render($exception);
6046

61-
if (null === $template) {
62-
return $this->htmlErrorRenderer->render($exception);
47+
if ($this->debug || !$template = $this->findTemplate($exception->getStatusCode())) {
48+
return $exception;
6349
}
6450

65-
return $this->twig->render($template, [
51+
return $exception->setAsString($this->twig->render($template, [
6652
'legacy' => false, // to be removed in 5.0
6753
'exception' => $exception,
6854
'status_code' => $exception->getStatusCode(),
69-
'status_text' => $exception->getTitle(),
70-
]);
55+
'status_text' => $exception->getStatusText(),
56+
]));
7157
}
7258

7359
private function findTemplate(int $statusCode): ?string

src/Symfony/Bridge/Twig/Mime/NotificationEmail.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace Symfony\Bridge\Twig\Mime;
1313

14-
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
14+
use Symfony\Component\ErrorHandler\Exception\FlattenException;
1515
use Symfony\Component\Mime\Header\Headers;
1616
use Symfony\Component\Mime\Part\AbstractPart;
1717
use Twig\Extra\CssInliner\CssInlinerExtension;

src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php renamed to src/Symfony/Bridge/Twig/Tests/ErrorRenderer/TwigErrorRendererTest.php

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,21 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Bundle\TwigBundle\Tests\ErrorRenderer;
12+
namespace Symfony\Bridge\Twig\Tests\ErrorRenderer;
1313

1414
use PHPUnit\Framework\TestCase;
15-
use Symfony\Bundle\TwigBundle\ErrorRenderer\TwigHtmlErrorRenderer;
16-
use Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer;
17-
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
15+
use Symfony\Bridge\Twig\ErrorRenderer\TwigErrorRenderer;
16+
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
17+
use Symfony\Component\ErrorHandler\Exception\FlattenException;
1818
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
1919
use Twig\Environment;
2020
use Twig\Loader\ArrayLoader;
2121

22-
class TwigHtmlErrorRendererTest extends TestCase
22+
class TwigErrorRendererTest extends TestCase
2323
{
2424
public function testFallbackToNativeRendererIfDebugOn()
2525
{
26-
$exception = FlattenException::createFromThrowable(new \Exception());
26+
$exception = new \Exception();
2727

2828
$twig = $this->createMock(Environment::class);
2929
$nativeRenderer = $this->createMock(HtmlErrorRenderer::class);
@@ -33,12 +33,12 @@ public function testFallbackToNativeRendererIfDebugOn()
3333
->with($exception)
3434
;
3535

36-
(new TwigHtmlErrorRenderer($twig, $nativeRenderer, true))->render($exception);
36+
(new TwigErrorRenderer($twig, $nativeRenderer, true))->render(new \Exception());
3737
}
3838

3939
public function testFallbackToNativeRendererIfCustomTemplateNotFound()
4040
{
41-
$exception = FlattenException::createFromThrowable(new NotFoundHttpException());
41+
$exception = new NotFoundHttpException();
4242

4343
$twig = new Environment(new ArrayLoader([]));
4444

@@ -47,27 +47,19 @@ public function testFallbackToNativeRendererIfCustomTemplateNotFound()
4747
->expects($this->once())
4848
->method('render')
4949
->with($exception)
50+
->willReturn(FlattenException::createFromThrowable($exception))
5051
;
5152

52-
(new TwigHtmlErrorRenderer($twig, $nativeRenderer, false))->render($exception);
53+
(new TwigErrorRenderer($twig, $nativeRenderer, false))->render($exception);
5354
}
5455

5556
public function testRenderCustomErrorTemplate()
5657
{
57-
$exception = FlattenException::createFromThrowable(new NotFoundHttpException());
58-
5958
$twig = new Environment(new ArrayLoader([
6059
'@Twig/Exception/error404.html.twig' => '<h1>Page Not Found</h1>',
6160
]));
61+
$exception = (new TwigErrorRenderer($twig))->render(new NotFoundHttpException());
6262

63-
$nativeRenderer = $this->createMock(HtmlErrorRenderer::class);
64-
$nativeRenderer
65-
->expects($this->never())
66-
->method('render')
67-
;
68-
69-
$content = (new TwigHtmlErrorRenderer($twig, $nativeRenderer, false))->render($exception);
70-
71-
$this->assertSame('<h1>Page Not Found</h1>', $content);
63+
$this->assertSame('<h1>Page Not Found</h1>', $exception->getAsString());
7264
}
7365
}

src/Symfony/Bridge/Twig/composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
"egulias/email-validator": "^2.1.10",
2525
"symfony/asset": "^3.4|^4.0|^5.0",
2626
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
27+
"symfony/error-handler": "^4.4|^5.0",
2728
"symfony/finder": "^3.4|^4.0|^5.0",
2829
"symfony/form": "^4.4|^5.0",
2930
"symfony/http-foundation": "^4.3|^5.0",
30-
"symfony/http-kernel": "^3.4|^4.0",
31+
"symfony/http-kernel": "^4.4",
3132
"symfony/mime": "^4.3|^5.0",
3233
"symfony/polyfill-intl-icu": "~1.0",
3334
"symfony/routing": "^3.4|^4.0|^5.0",

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class UnusedTagsPass implements CompilerPassInterface
3232
'controller.service_arguments',
3333
'config_cache.resource_checker',
3434
'data_collector',
35-
'error_renderer.renderer',
3635
'form.type',
3736
'form.type_extension',
3837
'form.type_guesser',

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
use Symfony\Component\DependencyInjection\Compiler\RegisterReverseContainerPass;
3434
use Symfony\Component\DependencyInjection\ContainerBuilder;
3535
use Symfony\Component\ErrorHandler\ErrorHandler;
36-
use Symfony\Component\ErrorRenderer\DependencyInjection\ErrorRendererPass;
3736
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
3837
use Symfony\Component\Form\DependencyInjection\FormPass;
3938
use Symfony\Component\HttpClient\DependencyInjection\HttpClientPass;
@@ -92,7 +91,6 @@ public function build(ContainerBuilder $container)
9291
KernelEvents::FINISH_REQUEST,
9392
];
9493

95-
$container->addCompilerPass(new ErrorRendererPass());
9694
$container->addCompilerPass(new LoggerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
9795
$container->addCompilerPass(new RegisterControllerArgumentLocatorsPass());
9896
$container->addCompilerPass(new RemoveEmptyControllerArgumentLocatorsPass(), PassConfig::TYPE_BEFORE_REMOVING);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy