Skip to content

Commit 710b51d

Browse files
committed
Fixed the priority order of the error renderers registration
1 parent 7dfc97b commit 710b51d

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/Symfony/Component/ErrorRenderer/DependencyInjection/ErrorRendererPass.php

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,22 @@ public function process(ContainerBuilder $container)
4040
return;
4141
}
4242

43-
$renderers = $registered = [];
43+
$renderers = [];
4444
foreach ($container->findTaggedServiceIds($this->rendererTag, true) as $serviceId => $tags) {
4545
/** @var ErrorRendererInterface $class */
4646
$class = $container->getDefinition($serviceId)->getClass();
4747

4848
foreach ($tags as $tag) {
4949
$format = $tag['format'] ?? $class::getFormat();
50-
if (!isset($registered[$format])) {
51-
$priority = $tag['priority'] ?? 0;
50+
$priority = $tag['priority'] ?? 0;
51+
if (!isset($renderers[$priority][$format])) {
5252
$renderers[$priority][$format] = new Reference($serviceId);
53-
$registered[$format] = true;
5453
}
5554
}
5655
}
5756

5857
if ($renderers) {
59-
krsort($renderers);
58+
ksort($renderers);
6059
$renderers = array_merge(...$renderers);
6160
}
6261

src/Symfony/Component/ErrorRenderer/Tests/DependencyInjection/ErrorRendererPassTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,20 @@ public function testProcess()
4848
];
4949
$this->assertEquals($expected, $serviceLocatorDefinition->getArgument(0));
5050
}
51+
52+
public function testServicesAreOrderedAccordingToPriority()
53+
{
54+
$container = new ContainerBuilder();
55+
$definition = $container->register('error_renderer')->setArguments([null]);
56+
$container->register('r2')->addTag('error_renderer.renderer', ['format' => 'json', 'priority' => 100]);
57+
$container->register('r1')->addTag('error_renderer.renderer', ['format' => 'json', 'priority' => 200]);
58+
$container->register('r3')->addTag('error_renderer.renderer', ['format' => 'json']);
59+
(new ErrorRendererPass())->process($container);
60+
61+
$expected = [
62+
'json' => new ServiceClosureArgument(new Reference('r1')),
63+
];
64+
$serviceLocatorDefinition = $container->getDefinition((string) $definition->getArgument(0));
65+
$this->assertEquals($expected, $serviceLocatorDefinition->getArgument(0));
66+
}
5167
}

0 commit comments

Comments
 (0)