Skip to content

Commit b197ca1

Browse files
[DependencyInjection] Fix "proxy" tag: resolve its parameters and pass it to child definitions
1 parent 11a87ad commit b197ca1

File tree

4 files changed

+28
-2
lines changed

4 files changed

+28
-2
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ private function doResolveDefinition(ChildDefinition $definition): Definition
187187
// and it's not legal on an instanceof
188188
$def->setAutoconfigured($definition->isAutoconfigured());
189189

190+
if (!$def->hasTag('proxy')) {
191+
foreach ($parentDef->getTag('proxy') as $v) {
192+
$def->addTag('proxy', $v);
193+
}
194+
}
195+
190196
return $def;
191197
}
192198
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ protected function processValue($value, $isRoot = false)
8585
if (isset($changes['file'])) {
8686
$value->setFile($this->bag->resolveValue($value->getFile()));
8787
}
88+
$tags = $value->getTags();
89+
if (isset($tags['proxy'])) {
90+
$tags['proxy'] = $this->bag->resolveValue($tags['proxy']);
91+
$value->setTags($tags);
92+
}
8893
}
8994

9095
$value = parent::processValue($value, $isRoot);

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,14 @@ public function testProcessDoesNotCopyShared()
9999
$this->assertTrue($def->isShared());
100100
}
101101

102-
public function testProcessDoesNotCopyTags()
102+
public function testProcessDoesNotCopyTagsButProxy()
103103
{
104104
$container = new ContainerBuilder();
105105

106106
$container
107107
->register('parent')
108108
->addTag('foo')
109+
->addTag('proxy')
109110
;
110111

111112
$container
@@ -115,7 +116,7 @@ public function testProcessDoesNotCopyTags()
115116
$this->process($container);
116117

117118
$def = $container->getDefinition('child');
118-
$this->assertEquals([], $def->getTags());
119+
$this->assertSame(['proxy' => [[]]], $def->getTags());
119120
}
120121

121122
public function testProcessDoesNotCopyDecoratedService()

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@ public function testParameterNotFoundExceptionsIsNotThrown()
9797
$this->assertCount(1, $definition->getErrors());
9898
}
9999

100+
public function testOnlyProxyTagIsResolved()
101+
{
102+
$containerBuilder = new ContainerBuilder();
103+
$containerBuilder->setParameter('a_param', 'here_you_go');
104+
$definition = $containerBuilder->register('def');
105+
$definition->addTag('foo', ['bar' => '%a_param%']);
106+
$definition->addTag('proxy', ['interface' => '%a_param%']);
107+
108+
$pass = new ResolveParameterPlaceHoldersPass(true, false);
109+
$pass->process($containerBuilder);
110+
111+
$this->assertSame(['foo' => [['bar' => '%a_param%']], 'proxy' => [['interface' => 'here_you_go']]], $definition->getTags());
112+
}
113+
100114
private function createContainerBuilder(): ContainerBuilder
101115
{
102116
$containerBuilder = new ContainerBuilder();

0 commit comments

Comments
 (0)