Skip to content

Commit c6317d6

Browse files
committed
[DependencyInjection] Accept existing interfaces as valid named args
1 parent 1802eb0 commit c6317d6

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

Compiler/ResolveNamedArgumentsPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ protected function processValue($value, $isRoot = false)
5353
$parameters = $r->getParameters();
5454
}
5555

56-
if (isset($key[0]) && '$' !== $key[0] && !class_exists($key)) {
56+
if (isset($key[0]) && '$' !== $key[0] && !class_exists($key) && !interface_exists($key, false)) {
5757
throw new InvalidArgumentException(sprintf('Invalid service "%s": did you forget to add the "$" prefix to argument "%s"?', $this->currentId, $key));
5858
}
5959

Tests/Compiler/ResolveNamedArgumentsPassTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\DependencyInjection\Tests\Compiler;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Psr\Container\ContainerInterface;
1516
use Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass;
1617
use Symfony\Component\DependencyInjection\ContainerBuilder;
1718
use Symfony\Component\DependencyInjection\Reference;
@@ -152,6 +153,19 @@ public function testTypedArgumentWithMissingDollar()
152153
$pass->process($container);
153154
}
154155

156+
public function testInterfaceTypedArgument()
157+
{
158+
$container = new ContainerBuilder();
159+
160+
$definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class);
161+
$definition->setArgument(ContainerInterface::class, $expected = new Reference('foo'));
162+
163+
$pass = new ResolveNamedArgumentsPass();
164+
$pass->process($container);
165+
166+
$this->assertSame($expected, $definition->getArgument(3));
167+
}
168+
155169
public function testResolvesMultipleArgumentsOfTheSameType()
156170
{
157171
$container = new ContainerBuilder();

Tests/Fixtures/NamedArgumentsDummy.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22

33
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
44

5+
use Psr\Container\ContainerInterface;
6+
57
/**
68
* @author Kévin Dunglas <dunglas@gmail.com>
79
*/
810
class NamedArgumentsDummy
911
{
10-
public function __construct(CaseSensitiveClass $c, $apiKey, $hostName)
12+
public function __construct(CaseSensitiveClass $c, $apiKey, $hostName, ContainerInterface $interface)
1113
{
1214
}
1315

0 commit comments

Comments
 (0)