Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f9c6958

Browse filesBrowse files
feature #42959 [DependencyInjection] Make auto-aliases private by default (nicolas-grekas)
This PR was merged into the 5.4 branch. Discussion ---------- [DependencyInjection] Make auto-aliases private by default | Q | A | ------------- | --- | Branch? | 5.4 | Bug fix? | no | New feature? | no | Deprecations? | yes | Tickets | - | License | MIT | Doc PR | - Replaces #41209 Before, this creates a public autoalias: ```yaml app.lock: tags: - { name: auto_alias, format: "app.%database_type%_lock" } ``` After, this creates a public autoalias: ```yaml app.lock: public: true tags: - { name: auto_alias, format: "app.%database_type%_lock" } ``` Omitting `public: true` will trigger a deprecation warning when the alias is accessed from `$container->get()`. In 6.0, the alias will be private by default if `public: true` is not set. Commits ------- 679f25e [DependencyInjection] Make auto-aliases private by default
2 parents eb2e8e7 + 679f25e commit f9c6958
Copy full SHA for f9c6958

File tree

5 files changed

+55
-6
lines changed
Filter options

5 files changed

+55
-6
lines changed

‎src/Symfony/Component/DependencyInjection/CHANGELOG.md

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/CHANGELOG.md
+1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/AutoAliasServicePass.php
+20-1Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/PassConfig.php
+2-2Lines 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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByActualDefinitionPass.php
+28-1Lines changed: 28 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])) {
@@ -69,6 +92,10 @@ public function process(ContainerBuilder $container)
6992
$container->setDefinition($definitionId, $definition);
7093
$container->removeDefinition($targetId);
7194
$replacements[$targetId] = $definitionId;
95+
96+
if ($target->isPublic() && $target->isDeprecated()) {
97+
$definition->addTag('container.private', $target->getDeprecation('%service_id%'));
98+
}
7299
}
73100
$this->replacements = $replacements;
74101

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

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/Compiler/ReplaceAliasByActualDefinitionPassTest.php
+4-2Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.