Thanks to visit codestin.com
Credit goes to github.com

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 <[email protected]>
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);

src/Symfony/Bundle/FrameworkBundle/Resources/config/console.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,6 @@
194194
<tag name="console.command" command="debug:form" />
195195
</service>
196196

197-
<service id="console.command.error_renderer_debug" class="Symfony\Component\ErrorRenderer\Command\DebugCommand">
198-
<argument type="collection" /> <!-- All error renderers are injected here by ErrorRendererPass -->
199-
<argument type="service" id="debug.file_link_formatter" on-invalid="null" />
200-
<tag name="console.command" command="debug:error-renderer" />
201-
</service>
202-
203197
<service id="console.command.secrets_set" class="Symfony\Bundle\FrameworkBundle\Command\SecretsSetCommand">
204198
<argument type="service" id="secrets.vault" />
205199
<argument type="service" id="secrets.local_vault" on-invalid="ignore" />

src/Symfony/Bundle/FrameworkBundle/Resources/config/error_renderer.xml

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd">
66

77
<services>
8-
<service id="error_renderer" class="Symfony\Component\ErrorRenderer\DependencyInjection\LazyLoadingErrorRenderer">
9-
<argument /> <!-- error renderer locator -->
10-
</service>
11-
12-
<service id="error_renderer.renderer.html" class="Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer">
13-
<tag name="error_renderer.renderer" />
8+
<service id="error_handler.error_renderer.html" class="Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer">
149
<argument>%kernel.debug%</argument>
1510
<argument>%kernel.charset%</argument>
1611
<argument type="service" id="debug.file_link_formatter" on-invalid="null" />
@@ -19,21 +14,19 @@
1914
<argument type="service" id="logger" on-invalid="null" />
2015
</service>
2116

22-
<service id="error_renderer.renderer.json" class="Symfony\Component\ErrorRenderer\ErrorRenderer\JsonErrorRenderer">
23-
<tag name="error_renderer.renderer" />
24-
<argument>%kernel.debug%</argument>
17+
<service id="error_handler.error_renderer.serializer" class="Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer">
18+
<argument type="service" id="serializer" />
19+
<argument type="service">
20+
<service>
21+
<factory class="Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer" method="getPreferredFormat" />
22+
<argument type="service" id="request_stack" />
23+
</service>
24+
</argument>
25+
<argument type="service" id="error_renderer.html" />
2526
</service>
2627

27-
<service id="error_renderer.renderer.xml" class="Symfony\Component\ErrorRenderer\ErrorRenderer\XmlErrorRenderer">
28-
<tag name="error_renderer.renderer" format="atom" />
29-
<tag name="error_renderer.renderer" />
30-
<argument>%kernel.debug%</argument>
31-
<argument>%kernel.charset%</argument>
32-
</service>
33-
34-
<service id="error_renderer.renderer.txt" class="Symfony\Component\ErrorRenderer\ErrorRenderer\TxtErrorRenderer">
35-
<tag name="error_renderer.renderer" />
36-
<argument>%kernel.debug%</argument>
37-
</service>
28+
<service id="error_renderer.html" alias="error_handler.error_renderer.html" />
29+
<service id="error_renderer.serializer" alias="error_handler.error_renderer.serializer" />
30+
<service id="error_renderer" alias="error_renderer.html" />
3831
</services>
3932
</container>

src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
<services>
1313
<defaults public="false" />
1414

15+
<service id="error_renderer" alias="error_renderer.serializer" />
16+
1517
<service id="serializer" class="Symfony\Component\Serializer\Serializer" public="true">
1618
<argument type="collection" />
1719
<argument type="collection" />
@@ -59,6 +61,12 @@
5961
<tag name="serializer.normalizer" priority="-900" />
6062
</service>
6163

64+
<service id="serializer.normalizer.problem" class="Symfony\Component\Serializer\Normalizer\ProblemNormalizer">
65+
<argument>%kernel.debug%</argument>
66+
<!-- Run before serializer.normalizer.object -->
67+
<tag name="serializer.normalizer" priority="-890" />
68+
</service>
69+
6270
<service id="serializer.normalizer.object" class="Symfony\Component\Serializer\Normalizer\ObjectNormalizer">
6371
<argument type="service" id="serializer.mapping.class_metadata_factory" />
6472
<argument type="service" id="serializer.name_converter.metadata_aware" />

src/Symfony/Bundle/FrameworkBundle/composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
"symfony/cache": "^4.4|^5.0",
2222
"symfony/config": "^4.3.4|^5.0",
2323
"symfony/dependency-injection": "^4.4|^5.0",
24-
"symfony/error-renderer": "^4.4|^5.0",
2524
"symfony/http-foundation": "^4.4|^5.0",
2625
"symfony/http-kernel": "^4.4",
2726
"symfony/polyfill-mbstring": "~1.0",
@@ -50,7 +49,7 @@
5049
"symfony/process": "^3.4|^4.0|^5.0",
5150
"symfony/security-csrf": "^3.4|^4.0|^5.0",
5251
"symfony/security-http": "^3.4|^4.0|^5.0",
53-
"symfony/serializer": "^4.3|^5.0",
52+
"symfony/serializer": "^4.4|^5.0",
5453
"symfony/stopwatch": "^3.4|^4.0|^5.0",
5554
"symfony/translation": "^4.4|^5.0",
5655
"symfony/templating": "^3.4|^4.0|^5.0",

0 commit comments

Comments
 (0)