Fixed the priority order of the error renderers registration
This commit is contained in:
parent
7dfc97be9f
commit
710b51dcb1
@ -40,23 +40,22 @@ class ErrorRendererPass implements CompilerPassInterface
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -48,4 +48,20 @@ class ErrorRendererPassTest extends TestCase
|
||||
];
|
||||
$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));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user