Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1c8c9f3

Browse files
[DependencyInjection] Make auto-aliases private by default
1 parent 8042736 commit 1c8c9f3

File tree

5 files changed

+56
-6
lines changed

5 files changed

+56
-6
lines changed

src/Symfony/Component/DependencyInjection/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ CHANGELOG
66

77
* Add `service_closure()` to the PHP-DSL
88
* Add support for autoconfigurable attributes on methods, properties and parameters
9+
* Make auto-aliases private by default
910

1011
5.3
1112
---

src/Symfony/Component/DependencyInjection/Compiler/AutoAliasServicePass.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
*/
2121
class AutoAliasServicePass implements CompilerPassInterface
2222
{
23+
private $privateAliases = [];
24+
2325
/**
2426
* {@inheritdoc}
2527
*/
@@ -33,9 +35,26 @@ public function process(ContainerBuilder $container)
3335

3436
$aliasId = $container->getParameterBag()->resolveValue($tag['format']);
3537
if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
36-
$container->setAlias($serviceId, new Alias($aliasId, true));
38+
$alias = new Alias($aliasId, $container->getDefinition($serviceId)->isPublic());
39+
$container->setAlias($serviceId, $alias);
40+
41+
if (!$alias->isPublic()) {
42+
$alias->setPublic(true);
43+
$this->privateAliases[] = $alias;
44+
}
3745
}
3846
}
3947
}
4048
}
49+
50+
/**
51+
* @internal to be removed in Symfony 6.0
52+
*/
53+
public function getPrivateAliases(): array
54+
{
55+
$privateAliases = $this->privateAliases;
56+
$this->privateAliases = [];
57+
58+
return $privateAliases;
59+
}
4160
}

src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public function __construct()
5151
];
5252

5353
$this->optimizationPasses = [[
54-
new AutoAliasServicePass(),
54+
$autoAliasServicePass = new AutoAliasServicePass(),
5555
new ValidateEnvPlaceholdersPass(),
5656
new ResolveDecoratorStackPass(),
5757
new ResolveChildDefinitionsPass(),
@@ -78,7 +78,7 @@ public function __construct()
7878

7979
$this->removingPasses = [[
8080
new RemovePrivateAliasesPass(),
81-
new ReplaceAliasByActualDefinitionPass(),
81+
(new ReplaceAliasByActualDefinitionPass())->setAutoAliasServicePass($autoAliasServicePass),
8282
new RemoveAbstractDefinitionsPass(),
8383
new RemoveUnusedDefinitionsPass(),
8484
new AnalyzeServiceReferencesPass(),

src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,19 @@
2525
class ReplaceAliasByActualDefinitionPass extends AbstractRecursivePass
2626
{
2727
private $replacements;
28+
private $autoAliasServicePass;
29+
30+
/**
31+
* @internal to be removed in Symfony 6.0
32+
*
33+
* @return $this
34+
*/
35+
public function setAutoAliasServicePass(AutoAliasServicePass $autoAliasServicePass): self
36+
{
37+
$this->autoAliasServicePass = $autoAliasServicePass;
38+
39+
return $this;
40+
}
2841

2942
/**
3043
* Process the Container to replace aliases with service definitions.
@@ -36,15 +49,25 @@ public function process(ContainerBuilder $container)
3649
// First collect all alias targets that need to be replaced
3750
$seenAliasTargets = [];
3851
$replacements = [];
52+
53+
$privateAliases = $this->autoAliasServicePass ? $this->autoAliasServicePass->getPrivateAliases() : [];
54+
foreach ($privateAliases as $target) {
55+
$target->setDeprecated('symfony/dependency-injection', '5.4', 'Accessing the "%alias_id%" service directly from the container is deprecated, use dependency injection instead.');
56+
}
57+
3958
foreach ($container->getAliases() as $definitionId => $target) {
4059
$targetId = (string) $target;
4160
// Special case: leave this target alone
4261
if ('service_container' === $targetId) {
4362
continue;
4463
}
45-
// Check if target needs to be replaces
64+
// Check if target needs to be replaced
4665
if (isset($replacements[$targetId])) {
4766
$container->setAlias($definitionId, $replacements[$targetId])->setPublic($target->isPublic());
67+
68+
if ($target->isDeprecated()) {
69+
$container->getAlias($definitionId)->setDeprecated(...array_values($target->getDeprecation('%alias_id%')));
70+
}
4871
}
4972
// No need to process the same target twice
5073
if (isset($seenAliasTargets[$targetId])) {
@@ -61,6 +84,7 @@ public function process(ContainerBuilder $container)
6184

6285
throw $e;
6386
}
87+
6488
if ($definition->isPublic()) {
6589
continue;
6690
}
@@ -69,6 +93,10 @@ public function process(ContainerBuilder $container)
6993
$container->setDefinition($definitionId, $definition);
7094
$container->removeDefinition($targetId);
7195
$replacements[$targetId] = $definitionId;
96+
97+
if ($target->isPublic() && $target->isDeprecated()) {
98+
$definition->addTag('container.private', $target->getDeprecation('%service_id%'));
99+
}
72100
}
73101
$this->replacements = $replacements;
74102

src/Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,20 +31,22 @@ public function testProcess()
3131
$bDefinition = new Definition('\stdClass');
3232
$container->setDefinition('b', $bDefinition);
3333

34-
$container->setAlias('a_alias', 'a')->setPublic(true);
35-
$container->setAlias('b_alias', 'b')->setPublic(true);
34+
$container->setAlias('a_alias', 'a')->setPublic(true)->setDeprecated('foo/bar', '1.2', '%alias_id%');
35+
$container->setAlias('b_alias', 'b')->setPublic(true)->setDeprecated('foo/bar', '1.2', '%alias_id%');
3636

3737
$container->setAlias('container', 'service_container');
3838

3939
$this->process($container);
4040

4141
$this->assertTrue($container->has('a'), '->process() does nothing to public definitions.');
4242
$this->assertTrue($container->hasAlias('a_alias'));
43+
$this->assertTrue($container->getAlias('a_alias')->isDeprecated());
4344
$this->assertFalse($container->has('b'), '->process() removes non-public definitions.');
4445
$this->assertTrue(
4546
$container->has('b_alias') && !$container->hasAlias('b_alias'),
4647
'->process() replaces alias to actual.'
4748
);
49+
$this->assertTrue($container->getDefinition('b_alias')->hasTag('container.private'));
4850

4951
$this->assertTrue($container->has('container'));
5052

0 commit comments

Comments
 (0)