Skip to content

Commit bef0003

Browse files
committed
Use a tagged iterator to register menu providers
The compiler pass is now only responsible for detecting whether we need to use the ChainProvider or no, but does not handle the configuration of the ChainProvider anymore.
1 parent 846d932 commit bef0003

File tree

3 files changed

+4
-36
lines changed

3 files changed

+4
-36
lines changed

config/menu.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<service id="Knp\Menu\Provider\MenuProviderInterface" alias="knp_menu.menu_provider" public="false"/>
3232

3333
<service id="knp_menu.menu_provider.chain" class="Knp\Menu\Provider\ChainProvider" public="false">
34-
<argument type="collection" />
34+
<argument type="tagged_iterator" tag="knp_menu.provider" />
3535
</service>
3636

3737
<service id="knp_menu.menu_provider.lazy" class="Knp\Menu\Provider\LazyProvider" public="false">

src/DependencyInjection/Compiler/AddProvidersPass.php

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
namespace Knp\Bundle\MenuBundle\DependencyInjection\Compiler;
44

5-
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
65
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
76
use Symfony\Component\DependencyInjection\ContainerBuilder;
8-
use Symfony\Component\DependencyInjection\Reference;
97

108
/**
11-
* This compiler pass registers the providers in the ChainProvider.
9+
* This compiler pass registers the ChainProvider or the only provider as `knp_menu.menu_provider`.
1210
*
1311
* @author Christophe Coevoet <[email protected]>
1412
*
@@ -18,26 +16,16 @@ final class AddProvidersPass implements CompilerPassInterface
1816
{
1917
public function process(ContainerBuilder $container): void
2018
{
21-
if (!$container->hasDefinition('knp_menu.menu_provider.chain')) {
22-
return;
23-
}
24-
2519
$providers = [];
2620
foreach ($container->findTaggedServiceIds('knp_menu.provider') as $id => $tags) {
27-
$providers[] = new Reference($id);
21+
$providers[] = $id;
2822
}
2923

3024
if (1 === \count($providers)) {
3125
// Use an alias instead of wrapping it in the ChainProvider for performances
3226
// when using only one (the default case as the bundle defines one provider)
33-
$container->setAlias('knp_menu.menu_provider', (string) \reset($providers));
27+
$container->setAlias('knp_menu.menu_provider', $providers[0]);
3428
} else {
35-
if (\class_exists(IteratorArgument::class)) {
36-
$providers = new IteratorArgument($providers);
37-
}
38-
39-
$definition = $container->getDefinition('knp_menu.menu_provider.chain');
40-
$definition->replaceArgument(0, $providers);
4129
$container->setAlias('knp_menu.menu_provider', 'knp_menu.menu_provider.chain');
4230
}
4331
}

tests/DependencyInjection/Compiler/AddProvidersPassTest.php

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,10 @@
55
use Knp\Bundle\MenuBundle\DependencyInjection\Compiler\AddProvidersPass;
66
use Knp\Menu\Provider\ChainProvider;
77
use PHPUnit\Framework\TestCase;
8-
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
98
use Symfony\Component\DependencyInjection\ContainerBuilder;
10-
use Symfony\Component\DependencyInjection\Reference;
119

1210
class AddProvidersPassTest extends TestCase
1311
{
14-
public function testProcessWithoutProviderDefinition(): void
15-
{
16-
$containerBuilder = new ContainerBuilder();
17-
(new AddProvidersPass())->process($containerBuilder);
18-
19-
self::assertFalse($containerBuilder->hasAlias('knp_menu.menu_provider'));
20-
}
21-
2212
public function testProcessForOneProvider(): void
2313
{
2414
$containerBuilder = new ContainerBuilder();
@@ -33,12 +23,6 @@ public function testProcessForOneProvider(): void
3323

3424
public function testProcessForManyProviders(): void
3525
{
36-
$expectedProviders = [new Reference('id'), new Reference('id2')];
37-
38-
if (\class_exists(IteratorArgument::class)) {
39-
$expectedProviders = new IteratorArgument($expectedProviders);
40-
}
41-
4226
$containerBuilder = new ContainerBuilder();
4327
$containerBuilder->register('knp_menu.menu_provider.chain', ChainProvider::class)->setArgument(0, []);
4428
$containerBuilder->register('id')->addTag('knp_menu.provider');
@@ -48,9 +32,5 @@ public function testProcessForManyProviders(): void
4832

4933
self::assertTrue($containerBuilder->hasAlias('knp_menu.menu_provider'));
5034
self::assertSame('knp_menu.menu_provider.chain', (string) $containerBuilder->getAlias('knp_menu.menu_provider'));
51-
52-
self::assertEquals(
53-
[$expectedProviders],
54-
$containerBuilder->getDefinition('knp_menu.menu_provider.chain')->getArguments());
5535
}
5636
}

0 commit comments

Comments
 (0)