8000 [ErrorHandler] merge and remove the ErrorRenderer component · symfony/symfony@6c9157b · GitHub
[go: up one dir, main page]

Skip to content

Commit 6c9157b

Browse files
[ErrorHandler] merge and remove the ErrorRenderer component
1 parent 10a349c commit 6c9157b

File tree

99 files changed

+536
-1640
lines changed

Some content is hidden

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

99 files changed

+536
-1640
lines changed

UPGRADE-4.4.md

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ Console
1818
Debug
1919
-----
2020

21-
* Deprecated the `Debug` class, use the one from the `ErrorRenderer` component instead
2221
* Deprecated the `FlattenException` class, use the one from the `ErrorRenderer` component instead
2322
* Deprecated the component in favor of the `ErrorHandler` component
2423

@@ -309,45 +308,35 @@ TwigBundle
309308
* Deprecated all built-in error templates, use the error renderer mechanism of the `ErrorRenderer` component
310309
* Deprecated loading custom error templates in non-html formats. Custom HTML error pages based on Twig keep working as before:
311310

312-
Before (`templates/bundles/TwigBundle/Exception/error.jsonld.twig`):
311+
Before (`templates/bundles/TwigBundle/Exception/error.json.twig`):
313312
```twig
314313
{
315-
"@id": "https://example.com",
316-
"@type": "error",
317-
"@context": {
318-
"title": "{{ status_text }}",
319-
"code": {{ status_code }},
320-
"message": "{{ exception.message }}"
321-
}
314+
"type": "https://example.com/error",
315+
"title": "{{ status_text }}",
316+
"status": {{ status_code }}
322317
}
323318
```
324319

325-
After (`App\ErrorRenderer\JsonLdErrorRenderer`):
320+
After (`App\Serializer\ProblemJsonNormalizer`):
326321
```php
327-
class JsonLdErrorRenderer implements ErrorRendererInterface
322+
class ProblemJsonNormalizer implements NormalizerInterface
328323
{
329-
public static function getFormat(): string
324+
public function normalize($exception, $format = null, array $context = [])
330325
{
331-
return 'jsonld';
326+
return [
327+
'type' => 'https://example.com/error',
328+
'title' => $exception->getStatusText(),
329+
'status' => $exception->getStatusCode(),
330+
];
332331
}
333332
334-
public function render(FlattenException $exception): string
333+
public function supportsNormalization($data, $format = null)
335334
{
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-
]);
335+
return 'json' === $format && $data instanceof FlattenException;
345336
}
346337
}
347338
```
348339

349-
Configure your rendering service tagging it with `error_renderer.renderer`.
350-
351340
Validator
352341
---------
353342

UPGRADE-5.0.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ Console
5757
Debug
5858
-----
5959

60-
* Removed the `Debug` class, use the one from the `ErrorRenderer` component instead
6160
* Removed the `FlattenException` class, use the one from the `ErrorRenderer` component instead
6261
* Removed the component in favor of the `ErrorHandler` component
6362

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/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/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: 8 additions & 19 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,15 @@
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>
25-
</service>
26-
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" />
17+
<service id="error_handler.error_renderer.serializer" class="Symfony\Component\ErrorHandler\ErrorRenderer\SerializerErrorRenderer">
18+
<argument type="service" id="serializer" />
19+
<argument type="service" id="request_stack" />
20+
<argument type="service" id="error_renderer.html" />
3021
<argument>%kernel.debug%</argument>
31-
<argument>%kernel.charset%</argument>
3222
</service>
3323

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>
24+
<service id="error_renderer.html" alias="error_handler.error_renderer.html" />
25+
<service id="error_renderer.serializer" alias="error_handler.error_renderer.serializer" />
26+
<service id="error_renderer" alias="error_renderer.html" />
3827
</services>
3928
</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",

src/Symfony/Bundle/SecurityBundle/Tests/Functional/JsonLoginTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@ public function testDefaultJsonLoginBadRequest()
7070

7171
$this->assertSame(400, $response->getStatusCode());
7272
$this->assertSame('application/json', $response->headers->get('Content-Type'));
73-
$this->assertSame(['title' => 'Bad Request', 'status' => 400, 'detail' => 'Whoops, looks like something went wrong.'], json_decode($response->getContent(), true));
73+
$this->assertSame(['type' => 'https://tools.ietf.org/html/rfc2616#section-10', 'title' => 'An error occurred', 'status' => 400, 'detail' => 'Bad Request'], json_decode($response->getContent(), true));
7474
}
7575
}

src/Symfony/Bundle/SecurityBundle/Tests/Functional/app/JsonLogin/config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
imports:
22
- { resource: ./../config/framework.yml }
33

4+
framework:
5+
serializer: ~
6+
47
security:
58
encoders:
69
Symfony\Component\Security\Core\User\User: plaintext

src/Symfony/Bundle/SecurityBundle/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"symfony/form": "^3.4|^4.0|^5.0",
3636
"symfony/framework-bundle": "^4.4|^5.0",
3737
"symfony/http-foundation": "^3.4|^4.0|^5.0",
38+
"symfony/serializer": "^4.4|^5.0",
3839
"symfony/translation": "^3.4|^4.0|^5.0",
3940
"symfony/twig-bundle": "^4.4|^5.0",
4041
"symfony/twig-bridge": "^3.4|^4.0|^5.0",

src/Symfony/Bundle/TwigBundle/CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ CHANGELOG
66

77
* marked the `TemplateIterator` as `internal`
88
* added HTML comment to beginning and end of `exception_full.html.twig`
9-
* added a new `TwigHtmlErrorRenderer` for `html` format, integrated with the `ErrorRenderer` component
10-
* deprecated `ExceptionController` and `PreviewErrorController` controllers, use `ErrorController` from the `HttpKernel` component instead
9+
* added a new `TwigHtmlErrorRenderer` for `html` format, integrated with the `ErrorHandler` component
10+
* deprecated `ExceptionController` and `PreviewErrorController` controllers, use `ErrorController` from the `HttpKernel` component instead
1111
* deprecated all built-in error templates in favor of the new error renderer mechanism
1212
* deprecated `twig.exception_controller` configuration option, set it to "null" and use `framework.error_controller` configuration instead
1313

src/Symfony/Bundle/TwigBundle/ErrorRenderer/TwigHtmlErrorRenderer.php

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111

1212
namespace Symfony\Bundle\TwigBundle\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;
@@ -40,34 +40,20 @@ public function __construct(Environment $twig, HtmlErrorRenderer $htmlErrorRende
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->htmlErrorRenderer->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/Bundle/TwigBundle/Resources/config/twig.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,9 @@
162162
<argument /> <!-- runtime locator -->
163163
</service>
164164

165-
<service id="twig.error_renderer.html" class="Symfony\Bundle\TwigBundle\ErrorRenderer\TwigHtmlErrorRenderer">
166-
<tag name="error_renderer.renderer" priority="1" />
165+
<service id="twig.error_renderer.html" class="Symfony\Bundle\TwigBundle\ErrorRenderer\TwigHtmlErrorRenderer" decorates="error_renderer.html">
167166
<argument type="service" id="twig" />
168-
<argument type="service" id="error_renderer.renderer.html" />
167+
<argument type="service" id="twig.error_renderer.html.inner" />
169168
<argument>%kernel.debug%</argument>
170169
</service>
171170
</services>

src/Symfony/Bundle/TwigBundle/Tests/ErrorRenderer/TwigHtmlErrorRendererTest.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Bundle\TwigBundle\ErrorRenderer\TwigHtmlErrorRenderer;
16-
use Symfony\Component\ErrorRenderer\ErrorRenderer\HtmlErrorRenderer;
17-
use Symfony\Component\ErrorRenderer\Exception\FlattenException;
16+
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
1817
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
1918
use Twig\Environment;
2019
use Twig\Loader\ArrayLoader;
@@ -23,7 +22,7 @@ class TwigHtmlErrorRendererTest extends TestCase
2322
{
2423
public function testFallbackToNativeRendererIfDebugOn()
2524
{
26-
$exception = FlattenException::createFromThrowable(new \Exception());
25+
$exception = new \Exception();
2726

2827
$twig = $this->createMock(Environment::class);
2928
$nativeRenderer = $this->createMock(HtmlErrorRenderer::class);
@@ -33,12 +32,12 @@ public function testFallbackToNativeRendererIfDebugOn()
3332
->with($exception)
3433
;
3534

36-
(new TwigHtmlErrorRenderer($twig, $nativeRenderer, true))->render($exception);
35+
(new TwigHtmlErrorRenderer($twig, $nativeRenderer, true))->render(new \Exception());
3736
}
3837

3938
public function testFallbackToNativeRendererIfCustomTemplateNotFound()
4039
{
41-
$exception = FlattenException::createFromThrowable(new NotFoundHttpException());
40+
$exception = new NotFoundHttpException();
4241

4342
$twig = new Environment(new ArrayLoader([]));
4443

@@ -54,7 +53,7 @@ public function testFallbackToNativeRendererIfCustomTemplateNotFound()
5453

5554
public function testRenderCustomErrorTemplate()
5655
{
57-
$exception = FlattenException::createFromThrowable(new NotFoundHttpException());
56+
$exception = new NotFoundHttpException();
5857

5958
$twig = new Environment(new ArrayLoader([
6059
'@Twig/Exception/error404.html.twig' => '<h1>Page Not Found</h1>',
@@ -68,6 +67,6 @@ public function testRenderCustomErrorTemplate()
6867

6968
$content = (new TwigHtmlErrorRenderer($twig, $nativeRenderer, false))->render($exception);
7069

71-
$this->assertSame('<h1>Page Not Found</h1>', $content);
70+
$this->assertSame('<h1>Page Not Found</h1>', $content->getAsString());
7271
}
7372
}

src/Symfony/Bundle/TwigBundle/Tests/Functional/EmptyAppTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use Symfony\Bundle\TwigBundle\TwigBundle;
1616
use Symfony\Component\Config\Loader\LoaderInterface;
1717
use Symfony\Component\DependencyInjection\ContainerBuilder;
18-
use Symfony\Component\ErrorRenderer\ErrorRenderer;
18+
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
1919
use Symfony\Component\Filesystem\Filesystem;
2020
use Symfony\Component\HttpKernel\Kernel;
2121

@@ -65,7 +65,8 @@ public function registerContainerConfiguration(LoaderInterface $loader)
6565
'strict_variables' => false,
6666
'exception_controller' => null,
6767
]);
68-
$container->register('error_renderer', ErrorRenderer::class);
68+
$container->register('error_renderer.html', HtmlErrorRenderer::class);
69+
$container->setAlias('error_renderer', 'error_renderer.html');
6970
$container->setParameter('debug.file_link_format', null);
7071
});
7172
}

src/Symfony/Bundle/TwigBundle/composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
],
1818
"require": {
1919
"php": "^7.1.3",
20-
"symfony/error-renderer": "^4.4|^5.0",
2120
"symfony/twig-bridge": "^4.4|^5.0",
2221
"symfony/http-foundation": "^4.3|^5.0",
2322
"symfony/http-kernel": "^4.4",

0 commit comments

Comments
 (0)
0