diff --git a/src/Symfony/Component/ErrorRenderer/DependencyInjection/ErrorRendererPass.php b/src/Symfony/Component/ErrorRenderer/DependencyInjection/ErrorRendererPass.php index aa502efac2f29..34c970adca6ac 100644 --- a/src/Symfony/Component/ErrorRenderer/DependencyInjection/ErrorRendererPass.php +++ b/src/Symfony/Component/ErrorRenderer/DependencyInjection/ErrorRendererPass.php @@ -40,23 +40,22 @@ public function process(ContainerBuilder $container) return; } - $renderers = $registered = []; + $renderers = []; foreach ($container->findTaggedServiceIds($this->rendererTag, true) as $serviceId => $tags) { /** @var ErrorRendererInterface $class */ $class = $container->getDefinition($serviceId)->getClass(); foreach ($tags as $tag) { $format = $tag['format'] ?? $class::getFormat(); - if (!isset($registered[$format])) { - $priority = $tag['priority'] ?? 0; + $priority = $tag['priority'] ?? 0; + if (!isset($renderers[$priority][$format])) { $renderers[$priority][$format] = new Reference($serviceId); - $registered[$format] = true; } } } if ($renderers) { - krsort($renderers); + ksort($renderers); $renderers = array_merge(...$renderers); } diff --git a/src/Symfony/Component/ErrorRenderer/Tests/DependencyInjection/ErrorRendererPassTest.php b/src/Symfony/Component/ErrorRenderer/Tests/DependencyInjection/ErrorRendererPassTest.php index 7fad3a5631bb8..e69fd860b85d8 100644 --- a/src/Symfony/Component/ErrorRenderer/Tests/DependencyInjection/ErrorRendererPassTest.php +++ b/src/Symfony/Component/ErrorRenderer/Tests/DependencyInjection/ErrorRendererPassTest.php @@ -48,4 +48,20 @@ public function testProcess() ]; $this->assertEquals($expected, $serviceLocatorDefinition->getArgument(0)); } + + public function testServicesAreOrderedAccordingToPriority() + { + $container = new ContainerBuilder(); + $definition = $container->register('error_renderer')->setArguments([null]); + $container->register('r2')->addTag('error_renderer.renderer', ['format' => 'json', 'priority' => 100]); + $container->register('r1')->addTag('error_renderer.renderer', ['format' => 'json', 'priority' => 200]); + $container->register('r3')->addTag('error_renderer.renderer', ['format' => 'json']); + (new ErrorRendererPass())->process($container); + + $expected = [ + 'json' => new ServiceClosureArgument(new Reference('r1')), + ]; + $serviceLocatorDefinition = $container->getDefinition((string) $definition->getArgument(0)); + $this->assertEquals($expected, $serviceLocatorDefinition->getArgument(0)); + } }