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:
commit
87f5876842
@ -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) {
|
||||||
$resolvedArguments[$j] = $argument;
|
if ($p->isVariadic() && \is_array($argument)) {
|
||||||
|
foreach ($argument as $variadicArgument) {
|
||||||
|
$resolvedArguments[$j++] = $variadicArgument;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$resolvedArguments[$j] = $argument;
|
||||||
|
}
|
||||||
|
|
||||||
continue 2;
|
continue 2;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
|
||||||
|
|
||||||
|
class NamedArgumentsVariadicsDummy
|
||||||
|
{
|
||||||
|
public function __construct(\stdClass $class, ...$variadics)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user