From 30d5bca494a4af319b6d6c5205318ad3b468353e Mon Sep 17 00:00:00 2001 From: Guilhem Niot Date: Tue, 21 Feb 2017 13:30:07 +0100 Subject: [PATCH 1/3] [DependencyInjection] Fix manual ordering of arguments --- .../Compiler/ResolveNamedArgumentsPass.php | 6 +++++- .../Compiler/ResolveNamedArgumentsPassTest.php | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php index 75ea14a28a67b..8f49c8172dd19 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php @@ -49,8 +49,12 @@ protected function processValue($value, $isRoot = false) if (is_int($key) || '' === $key || '$' !== $key[0]) { if (!is_int($key)) { @trigger_error(sprintf('Using key "%s" for defining arguments of method "%s" for service "%s" is deprecated since Symfony 3.3 and will throw an exception in 4.0. Use no keys or $named arguments instead.', $key, $method, $this->currentId), E_USER_DEPRECATED); + + $resolvedArguments[] = $argument; + continue; } - $resolvedArguments[] = $argument; + + $resolvedArguments[$key] = $argument; continue; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php index a933b950dff0d..8f9aea3485dbc 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php @@ -91,6 +91,19 @@ public function testArgumentNotFound() $pass = new ResolveNamedArgumentsPass(); $pass->process($container); } + + public function testArgumentsWithManualIndexes() + { + $container = new ContainerBuilder(); + + $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class); + $definition->setArguments(array(1 => '123', 0 => new Reference('foo'))); + + $pass = new ResolveNamedArgumentsPass(); + $pass->process($container); + + $this->assertEquals(array(new Reference('foo'), '123'), $definition->getArguments()); + } } class NoConstructor From da9e13f65b7e3235882f68dbc7088439ef94f768 Mon Sep 17 00:00:00 2001 From: Guilhem Niot Date: Tue, 21 Feb 2017 13:50:03 +0100 Subject: [PATCH 2/3] Added a bc layer --- .../Compiler/ResolveNamedArgumentsPass.php | 12 ++++++++---- .../Tests/Compiler/ResolveNamedArgumentsPassTest.php | 6 ++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php index 8f49c8172dd19..70c643af64378 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveNamedArgumentsPass.php @@ -45,16 +45,20 @@ protected function processValue($value, $isRoot = false) $parameters = null; $resolvedArguments = array(); + $previousIndex = null; foreach ($arguments as $key => $argument) { if (is_int($key) || '' === $key || '$' !== $key[0]) { if (!is_int($key)) { @trigger_error(sprintf('Using key "%s" for defining arguments of method "%s" for service "%s" is deprecated since Symfony 3.3 and will throw an exception in 4.0. Use no keys or $named arguments instead.', $key, $method, $this->currentId), E_USER_DEPRECATED); - - $resolvedArguments[] = $argument; - continue; + } else { + if (null !== $previousIndex && $key < $previousIndex) { + @trigger_error(sprintf('Using key "%s" after the key "%s" for defining arguments of method "%s" for service "%s" is deprecated since Symfony 3.3. They will be automatically reordered in 4.0.', $key, $previousIndex, $method, $this->currentId), E_USER_DEPRECATED); + } else { + $previousIndex = $key; + } } - $resolvedArguments[$key] = $argument; + $resolvedArguments[] = $argument; continue; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php index 8f9aea3485dbc..f0bc0ab1fcf59 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php @@ -92,6 +92,10 @@ public function testArgumentNotFound() $pass->process($container); } + /** + * @group legacy + * @expectedDeprecation Using key "0" after the key "1" for defining arguments of method "__construct" for service "Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy" is deprecated since Symfony 3.3. They will be automatically reordered in 4.0. + */ public function testArgumentsWithManualIndexes() { $container = new ContainerBuilder(); @@ -101,8 +105,6 @@ public function testArgumentsWithManualIndexes() $pass = new ResolveNamedArgumentsPass(); $pass->process($container); - - $this->assertEquals(array(new Reference('foo'), '123'), $definition->getArguments()); } } From 6bee7f63df8b270bf979d1ace4978d49968c7bb2 Mon Sep 17 00:00:00 2001 From: Guilhem Niot Date: Tue, 21 Feb 2017 14:05:52 +0100 Subject: [PATCH 3/3] Add a test case --- .../Compiler/ResolveNamedArgumentsPassTest.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php index f0bc0ab1fcf59..07d4068875edb 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php @@ -106,6 +106,19 @@ public function testArgumentsWithManualIndexes() $pass = new ResolveNamedArgumentsPass(); $pass->process($container); } + + public function testCase() + { + $container = new ContainerBuilder(); + + $definition = $container->register(NamedArgumentsDummy::class, NamedArgumentsDummy::class); + $definition->setArguments(array('$apiKey' => '123', 0 => new Reference('foo'))); + + $pass = new ResolveNamedArgumentsPass(); + $pass->process($container); + + $this->assertEquals(array(1 => '123', 2 => new Reference('foo')), $definition->getArguments()); + } } class NoConstructor