feature #24937 [DependencyInjection] Added support for variadics in named arguments (PabloKowalczyk)

This PR was squashed before being merged into the 4.1-dev branch (closes #24937).

Discussion
----------

[DependencyInjection] Added support for variadics in named arguments

| Q             | A
| ------------- | ---
| Branch?       | 4.1
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #24935
| License       | MIT

Commits
-------

b5c0e8977c [DependencyInjection] Added support for variadics in named arguments
This commit is contained in:
Fabien Potencier 2017-12-01 06:31:07 -08:00
commit 87f5876842
3 changed files with 48 additions and 1 deletions

View File

@ -55,7 +55,13 @@ class ResolveNamedArgumentsPass extends AbstractRecursivePass
if (isset($key[0]) && '$' === $key[0]) { if (isset($key[0]) && '$' === $key[0]) {
foreach ($parameters as $j => $p) { foreach ($parameters as $j => $p) {
if ($key === '$'.$p->name) { if ($key === '$'.$p->name) {
if ($p->isVariadic() && \is_array($argument)) {
foreach ($argument as $variadicArgument) {
$resolvedArguments[$j++] = $variadicArgument;
}
} else {
$resolvedArguments[$j] = $argument; $resolvedArguments[$j] = $argument;
}
continue 2; continue 2;
} }

View File

@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass; use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy; use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy;
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsVariadicsDummy;
use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy; use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
/** /**
@ -152,6 +153,36 @@ class ResolveNamedArgumentsPassTest extends TestCase
$this->assertEquals(array(new Reference('bar'), 'qwerty', new Reference('foo')), $definition->getArguments()); $this->assertEquals(array(new Reference('bar'), 'qwerty', new Reference('foo')), $definition->getArguments());
} }
public function testVariadics()
{
$container = new ContainerBuilder();
$definition = $container->register(NamedArgumentsVariadicsDummy::class, NamedArgumentsVariadicsDummy::class);
$definition->setArguments(
array(
'$class' => new \stdClass(),
'$variadics' => array(
new Reference('foo'),
new Reference('bar'),
new Reference('baz'),
),
)
);
$pass = new ResolveNamedArgumentsPass();
$pass->process($container);
$this->assertEquals(
array(
0 => new \stdClass(),
1 => new Reference('foo'),
2 => new Reference('bar'),
3 => new Reference('baz'),
),
$definition->getArguments()
);
}
} }
class NoConstructor class NoConstructor

View File

@ -0,0 +1,10 @@
<?php
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
class NamedArgumentsVariadicsDummy
{
public function __construct(\stdClass $class, ...$variadics)
{
}
}