Skip to content

Commit 63c21fb

Browse files
minor #49625 [DependencyInjection] Keep track of decorated ids (nicolas-grekas)
This PR was merged into the 6.3 branch. Discussion ---------- [DependencyInjection] Keep track of decorated ids | Q | A | ------------- | --- | Branch? | 6.3 | Bug fix? | no | New feature? | yes | Deprecations? | no | Tickets | - | License | MIT | Doc PR | - When a service "foo" is decorated by a service "bar", all references to "foo" are replaced by references to "bar". This has visible side effects e.g. when running `debug:autowiring`, before this PR: ``` Symfony\Contracts\HttpClient\HttpClientInterface (.debug.http_client) ``` After: ``` Symfony\Contracts\HttpClient\HttpClientInterface (http_client) ``` Details matter ;) This PR replaces #49622 since it's a less invasive way to achieve this behavior. Commits ------- 1ac07d3 [DependencyInjection] Keep track of decorated ids
2 parents d6ddbfe + 1ac07d3 commit 63c21fb

File tree

5 files changed

+21
-6
lines changed

5 files changed

+21
-6
lines changed

src/Symfony/Bundle/FrameworkBundle/Command/DebugAutowiringCommand.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,21 @@ protected function execute(InputInterface $input, OutputInterface $output): int
119119
if ($builder->hasAlias($serviceId)) {
120120
$hasAlias[$serviceId] = true;
121121
$serviceAlias = $builder->getAlias($serviceId);
122-
$serviceLine .= ' <fg=cyan>('.$serviceAlias.')</>';
122+
123+
if ($builder->hasDefinition($serviceAlias) && $decorated = $builder->getDefinition($serviceAlias)->getTag('container.decorator')) {
124+
$serviceLine .= ' <fg=cyan>('.$decorated[0]['id'].')</>';
125+
} else {
126+
$serviceLine .= ' <fg=cyan>('.$serviceAlias.')</>';
127+
}
123128

124129
if ($serviceAlias->isDeprecated()) {
125130
$serviceLine .= ' - <fg=magenta>deprecated</>';
126131
}
127132
} elseif (!$all) {
128133
++$serviceIdsNb;
129134
continue;
135+
} elseif ($builder->getDefinition($serviceId)->isDeprecated()) {
136+
$serviceLine .= ' - <fg=magenta>deprecated</>';
130137
}
131138
$text[] = $serviceLine;
132139
$io->text($text);

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ public function process(ContainerBuilder $container)
112112

113113
$container->setAlias($inner, $id)->setPublic($public);
114114
}
115+
116+
foreach ($decoratingDefinitions as $inner => $definition) {
117+
$definition->addTag('container.decorator', ['id' => $inner]);
118+
}
115119
}
116120

117121
protected function processValue(mixed $value, bool $isRoot = false): mixed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitio
198198
$this->process($container);
199199

200200
$this->assertEmpty($container->getDefinition('baz.inner')->getTags());
201-
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
201+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar'], 'container.decorator' => [['id' => 'foo']]], $container->getDefinition('baz')->getTags());
202202
}
203203

204204
public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitionMultipleTimes()
@@ -221,7 +221,7 @@ public function testProcessMovesTagsFromDecoratedDefinitionToDecoratingDefinitio
221221
$this->process($container);
222222

223223
$this->assertEmpty($container->getDefinition('deco1')->getTags());
224-
$this->assertEquals(['bar' => ['attr' => 'baz']], $container->getDefinition('deco2')->getTags());
224+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'container.decorator' => [['id' => 'foo']]], $container->getDefinition('deco2')->getTags());
225225
}
226226

227227
public function testProcessLeavesServiceLocatorTagOnOriginalDefinition()
@@ -240,7 +240,7 @@ public function testProcessLeavesServiceLocatorTagOnOriginalDefinition()
240240
$this->process($container);
241241

242242
$this->assertEquals(['container.service_locator' => [0 => []]], $container->getDefinition('baz.inner')->getTags());
243-
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
243+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar'], 'container.decorator' => [['id' => 'foo']]], $container->getDefinition('baz')->getTags());
244244
}
245245

246246
public function testProcessLeavesServiceSubscriberTagOnOriginalDefinition()
@@ -259,7 +259,7 @@ public function testProcessLeavesServiceSubscriberTagOnOriginalDefinition()
259259
$this->process($container);
260260

261261
$this->assertEquals(['container.service_subscriber' => [], 'container.service_subscriber.locator' => []], $container->getDefinition('baz.inner')->getTags());
262-
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
262+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar'], 'container.decorator' => [['id' => 'foo']]], $container->getDefinition('baz')->getTags());
263263
}
264264

265265
public function testProcessLeavesProxyTagOnOriginalDefinition()
@@ -278,7 +278,7 @@ public function testProcessLeavesProxyTagOnOriginalDefinition()
278278
$this->process($container);
279279

280280
$this->assertEquals(['proxy' => 'foo'], $container->getDefinition('baz.inner')->getTags());
281-
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar']], $container->getDefinition('baz')->getTags());
281+
$this->assertEquals(['bar' => ['attr' => 'baz'], 'foobar' => ['attr' => 'bar'], 'container.decorator' => [['id' => 'foo']]], $container->getDefinition('baz')->getTags());
282282
}
283283

284284
public function testCannotDecorateSyntheticService()

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/anonymous.expected.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ services:
1515
decorated:
1616
class: Symfony\Component\DependencyInjection\Tests\Fixtures\StdClassDecorator
1717
public: true
18+
tags:
19+
- container.decorator: { id: decorated }
1820
arguments: [!service { class: stdClass }]

src/Symfony/Component/DependencyInjection/Tests/Fixtures/config/child.expected.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ services:
77
foo:
88
class: Class2
99
public: true
10+
tags:
11+
- container.decorator: { id: bar }
1012
file: file.php
1113
lazy: true
1214
arguments: [!service { class: Class1 }]

0 commit comments

Comments
 (0)