Skip to content

Commit 9d0c280

Browse files
committed
[DependencyInjection][ServiceSubscriber] Support late aliases
1 parent 2e02a27 commit 9d0c280

File tree

5 files changed

+46
-5
lines changed

5 files changed

+46
-5
lines changed

Dumper/PhpDumper.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1700,7 +1700,11 @@ private function dumpValue($value, bool $interpolate = true): string
17001700
if (!$v) {
17011701
continue;
17021702
}
1703-
$definition = $this->container->findDefinition($id = (string) $v);
1703+
$id = (string) $v;
1704+
while ($this->container->hasAlias($id)) {
1705+
$id = (string) $this->container->getAlias($id);
1706+
}
1707+
$definition = $this->container->getDefinition($id);
17041708
$load = !($definition->hasErrors() && $e = $definition->getErrors()) ? $this->asFiles && !$this->inlineFactories && !$this->isHotPath($definition) : reset($e);
17051709
$serviceMap .= sprintf("\n %s => [%s, %s, %s, %s],",
17061710
$this->export($k),

Tests/Compiler/RegisterServiceSubscribersPassTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public function testNoAttributes()
8888
CustomDefinition::class => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
8989
'bar' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'bar')),
9090
'baz' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'baz')),
91+
'late_alias' => new ServiceClosureArgument(new TypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'late_alias')),
9192
];
9293

9394
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
@@ -118,6 +119,7 @@ public function testWithAttributes()
118119
CustomDefinition::class => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
119120
'bar' => new ServiceClosureArgument(new TypedReference('bar', CustomDefinition::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'bar')),
120121
'baz' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'baz')),
122+
'late_alias' => new ServiceClosureArgument(new TypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'late_alias')),
121123
];
122124

123125
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));
@@ -260,6 +262,7 @@ public function testBinding()
260262
CustomDefinition::class => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)),
261263
'bar' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'bar')),
262264
'baz' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'baz')),
265+
'late_alias' => new ServiceClosureArgument(new TypedReference(TestDefinition1::class, TestDefinition1::class, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'late_alias')),
263266
];
264267

265268
$this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0));

Tests/Dumper/PhpDumperTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
2020
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
2121
use Symfony\Component\DependencyInjection\Argument\ServiceLocator as ArgumentServiceLocator;
22+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
23+
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
2224
use Symfony\Component\DependencyInjection\ContainerBuilder;
2325
use Symfony\Component\DependencyInjection\ContainerInterface as SymfonyContainerInterface;
2426
use Symfony\Component\DependencyInjection\Definition;
@@ -35,6 +37,7 @@
3537
use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition;
3638
use Symfony\Component\DependencyInjection\Tests\Fixtures\ScalarFactory;
3739
use Symfony\Component\DependencyInjection\Tests\Fixtures\StubbedTranslator;
40+
use Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1;
3841
use Symfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriber;
3942
use Symfony\Component\DependencyInjection\TypedReference;
4043
use Symfony\Component\DependencyInjection\Variable;
@@ -906,6 +909,20 @@ public function testServiceSubscriber()
906909

907910
$container->register(CustomDefinition::class, CustomDefinition::class)
908911
->setPublic(false);
912+
913+
$container->register(TestDefinition1::class, TestDefinition1::class)->setPublic(true);
914+
915+
$container->addCompilerPass(new class() implements CompilerPassInterface {
916+
/**
917+
* {@inheritdoc}
918+
*/
919+
public function process(ContainerBuilder $container)
920+
{
921+
$container->setDefinition('late_alias', new Definition(TestDefinition1::class));
922+
$container->setAlias(TestDefinition1::class, 'late_alias');
923+
}
924+
}, PassConfig::TYPE_AFTER_REMOVING);
925+
909926
$container->compile();
910927

911928
$dumper = new PhpDumper($container);

Tests/Fixtures/TestServiceSubscriber.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public static function getSubscribedServices(): array
2222
'?'.CustomDefinition::class,
2323
'bar' => CustomDefinition::class,
2424
'baz' => '?'.CustomDefinition::class,
25+
'late_alias' => TestDefinition1::class,
2526
];
2627
}
2728
}

Tests/Fixtures/php/services_subscriber.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ public function __construct()
2727
$this->methodMap = [
2828
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber' => 'getTestServiceSubscriberService',
2929
'foo_service' => 'getFooServiceService',
30+
'late_alias' => 'getLateAliasService',
31+
];
32+
$this->aliases = [
33+
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestDefinition1' => 'late_alias',
3034
];
31-
32-
$this->aliases = [];
3335
}
3436

3537
public function compile(): void
@@ -45,11 +47,13 @@ public function isCompiled(): bool
4547
public function getRemovedIds(): array
4648
{
4749
return [
48-
'.service_locator.bPEFRiK' => true,
49-
'.service_locator.bPEFRiK.foo_service' => true,
50+
'.service_locator.CpwjbIa' => true,
51+
'.service_locator.CpwjbIa.foo_service' => true,
5052
'Psr\\Container\\ContainerInterface' => true,
5153
'Symfony\\Component\\DependencyInjection\\ContainerInterface' => true,
5254
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition' => true,
55+
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestDefinition1' => true,
56+
'late_alias' => true,
5357
];
5458
}
5559

@@ -75,14 +79,26 @@ protected function getFooServiceService()
7579
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber' => ['services', 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber', 'getTestServiceSubscriberService', false],
7680
'bar' => ['services', 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber', 'getTestServiceSubscriberService', false],
7781
'baz' => ['privates', 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition', 'getCustomDefinitionService', false],
82+
'late_alias' => ['services', 'late_alias', 'getLateAliasService', false],
7883
], [
7984
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition' => 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition',
8085
'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber' => 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestServiceSubscriber',
8186
'bar' => 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition',
8287
'baz' => 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition',
88+
'late_alias' => 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\TestDefinition1',
8389
]))->withContext('foo_service', $this));
8490
}
8591

92+
/**
93+
* Gets the public 'late_alias' shared service.
94+
*
95+
* @return \Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1
96+
*/
97+
protected function getLateAliasService()
98+
{
99+
return $this->services['late_alias'] = new \Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1();
100+
}
101+
86102
/**
87103
* Gets the private 'Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition' shared service.
88104
*

0 commit comments

Comments
 (0)