Skip to content

Commit 7816a98

Browse files
boekkooifabpot
authored andcommitted
[DependencyInjection] inlined factory not referenced
1 parent 1f55706 commit 7816a98

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ private function processArguments(array $arguments)
111111
$this->processArguments($argument->getArguments());
112112
$this->processArguments($argument->getMethodCalls());
113113
$this->processArguments($argument->getProperties());
114+
115+
if ($argument->getFactoryService()) {
116+
$this->processArguments(array(new Reference($argument->getFactoryService())));
117+
}
114118
}
115119
}
116120
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ private function isInlineableDefinition(ContainerBuilder $container, $id, Defini
138138
return false;
139139
}
140140

141+
if (count($ids) > 1 && $definition->getFactoryService()) {
142+
return false;
143+
}
144+
141145
return $container->getDefinition(reset($ids))->getScope() === $definition->getScope();
142146
}
143147
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,28 @@ public function testProcessDetectsReferencesFromInlinedDefinitions()
7979
$this->assertSame($ref, $refs[0]->getValue());
8080
}
8181

82+
public function testProcessDetectsReferencesFromInlinedFactoryDefinitions()
83+
{
84+
$container = new ContainerBuilder();
85+
86+
$container
87+
->register('a')
88+
;
89+
90+
$factory = new Definition();
91+
$factory->setFactoryService('a');
92+
93+
$container
94+
->register('b')
95+
->addArgument($factory)
96+
;
97+
98+
$graph = $this->process($container);
99+
100+
$this->assertTrue($graph->hasNode('a'));
101+
$this->assertCount(1, $refs = $graph->getNode('a')->getInEdges());
102+
}
103+
82104
public function testProcessDoesNotSaveDuplicateReferences()
83105
{
84106
$container = new ContainerBuilder();

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

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,84 @@ public function testProcessInlinesIfMultipleReferencesButAllFromTheSameDefinitio
110110
$this->assertSame($a, $inlinedArguments[0]);
111111
}
112112

113+
public function testProcessInlinesPrivateFactoryReference()
114+
{
115+
$container = new ContainerBuilder();
116+
117+
$container->register('a')->setPublic(false);
118+
$b = $container
119+
->register('b')
120+
->setPublic(false)
121+
->setFactoryService('a')
122+
;
123+
124+
$container
125+
->register('foo')
126+
->setArguments(array(
127+
$ref = new Reference('b'),
128+
));
129+
130+
$this->process($container);
131+
132+
$inlinedArguments = $container->getDefinition('foo')->getArguments();
133+
$this->assertSame($b, $inlinedArguments[0]);
134+
}
135+
136+
public function testProcessDoesNotInlinePrivateFactoryIfReferencedMultipleTimesWithinTheSameDefinition()
137+
{
138+
$container = new ContainerBuilder();
139+
$container
140+
->register('a')
141+
;
142+
$container
143+
->register('b')
144+
->setPublic(false)
145+
->setFactoryService('a')
146+
;
147+
148+
$container
149+
->register('foo')
150+
->setArguments(array(
151+
$ref1 = new Reference('b'),
152+
$ref2 = new Reference('b'),
153+
))
154+
;
155+
$this->process($container);
156+
157+
$args = $container->getDefinition('foo')->getArguments();
158+
$this->assertSame($ref1, $args[0]);
159+
$this->assertSame($ref2, $args[1]);
160+
}
161+
162+
public function testProcessDoesNotInlineReferenceWhenUsedByInlineFactory()
163+
{
164+
$container = new ContainerBuilder();
165+
$container
166+
->register('a')
167+
;
168+
$container
169+
->register('b')
170+
->setPublic(false)
171+
->setFactoryService('a')
172+
;
173+
174+
$inlineFactory = new Definition();
175+
$inlineFactory->setPublic(false);
176+
$inlineFactory->setFactoryService('b');
177+
178+
$container
179+
->register('foo')
180+
->setArguments(array(
181+
$ref = new Reference('b'),
182+
$inlineFactory,
183+
))
184+
;
185+
$this->process($container);
186+
187+
$args = $container->getDefinition('foo')->getArguments();
188+
$this->assertSame($ref, $args[0]);
189+
}
190+
113191
public function testProcessInlinesOnlyIfSameScope()
114192
{
115193
$container = new ContainerBuilder();

0 commit comments

Comments
 (0)