8000 [DependencyInjection] Autowing: exclude abstract definitons · symfony/symfony@ac456ee · GitHub
[go: up one dir, main page]

Skip to content

Commit ac456ee

Browse files
committed
[DependencyInjection] Autowing: exclude abstract definitons
1 parent 71d502a commit ac456ee

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,17 @@ private function populateAvailableTypes()
138138
*/
139139
private function populateAvailableType($id, Definition $definition)
140140
{
141+
// Never use abstract services
142+
if ($definition->isAbstract()) {
143+
return;
144+
}
145+
141146
foreach ($definition->getAutowiringTypes() as $type) {
142147
$this->definedTypes[$type] = true;
143148
$this->types[$type] = $id;
144149
}
145150

151+
// Cannot use reflection if the class isn't set
146152
if (!$definition->getClass()) {
147153
return;
148154
}

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public function testDontTriggerAutowiring()
202202
$this->assertCount(0, $container->getDefinition('bar')->getArguments());
203203
}
204204

205+
205206
/**
206207
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
207208
* @expectedExceptionMessage Cannot autowire argument 2 for Symfony\Component\DependencyInjection\Tests\Compiler\BadTypeHintedArgument because the type-hinted class does not exist (Class Symfony\Component\DependencyInjection\Tests\Compiler\NotARealClass does not exist).
@@ -210,12 +211,27 @@ public function testClassNotFoundThrowsException()
210211
{
211212
$container = new ContainerBuilder();
212213

213-
$aDefinition = $container->register('a', __NAMESPACE__.'\BadTypeHintedArgument');
214+
$aDefinition = $container->register('a', __NAMESPACE__ . '\BadTypeHintedArgument');
214215
$aDefinition->setAutowired(true);
215216

216217
$pass = new AutowirePass();
217218
$pass->process($container);
218219
}
220+
221+
public function testDontUseAbstractServices()
222+
{
223+
$container = new ContainerBuilder();
224+
225+
$container->register('abstract_foo', __NAMESPACE__.'\Foo')->setAbstract(true);
226+
$container->register('foo', __NAMESPACE__.'\Foo');
227+
$container->register('bar', __NAMESPACE__.'\Bar')->setAutowired(true);
228+
229+
$pass = new AutowirePass();
230+
$pass->process($container);
231+
232+
$arguments = $container->getDefinition('bar')->getArguments();
233+
$this->assertSame('foo', (string) $arguments[0]);
234+
}
219235
}
220236

221237
class Foo

0 commit comments

Comments
 (0)
0