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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$renderers = $registered = [];
|
$renderers = [];
|
||||||
foreach ($container->findTaggedServiceIds($this->rendererTag, true) as $serviceId => $tags) {
|
foreach ($container->findTaggedServiceIds($this->rendererTag, true) as $serviceId => $tags) {
|
||||||
/** @var ErrorRendererInterface $class */
|
/** @var ErrorRendererInterface $class */
|
||||||
$class = $container->getDefinition($serviceId)->getClass();
|
$class = $container->getDefinition($serviceId)->getClass();
|
||||||
|
|
||||||
foreach ($tags as $tag) {
|
foreach ($tags as $tag) {
|
||||||
$format = $tag['format'] ?? $class::getFormat();
|
$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);
|
$renderers[$priority][$format] = new Reference($serviceId);
|
||||||
$registered[$format] = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($renderers) {
|
if ($renderers) {
|
||||||
krsort($renderers);
|
ksort($renderers);
|
||||||
$renderers = array_merge(...$renderers);
|
$renderers = array_merge(...$renderers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,4 +48,20 @@ class ErrorRendererPassTest extends TestCase
|
|||||||
];
|
];
|
||||||
$this->assertEquals($expected, $serviceLocatorDefinition->getArgument(0));
|
$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