From de85e891bf8e7103d57cc888d3441dd4d19ca1cf Mon Sep 17 00:00:00 2001 From: matze Date: Sun, 22 Jan 2017 15:49:28 +0100 Subject: [PATCH 1/3] [DependencyInjection] Fixed variadic method parameter in autowired classes ReflectionException: Internal error: Failed to retrieve the default value in /www/raspberry/vendor/symfony/dependency-injection/Compiler/AutowirePass.php:437 --- .../Compiler/AutowirePass.php | 2 +- .../Tests/Compiler/AutowirePassTest.php | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index 01c114e54014f..d496f1ee2c069 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -341,7 +341,7 @@ private static function getResourceMetadataForMethod(\ReflectionMethod $method) $methodArgumentsMetadata[] = array( 'class' => $class, 'isOptional' => $parameter->isOptional(), - 'defaultValue' => $parameter->isOptional() ? $parameter->getDefaultValue() : null, + 'defaultValue' => ($parameter->isOptional() && !$parameter->isVariadic()) ? $parameter->getDefaultValue() : null, ); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index 16c8130cd5cad..5ec3eafee2da0 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -35,6 +35,20 @@ public function testProcess() $this->assertEquals('foo', (string) $container->getDefinition('bar')->getArgument(0)); } + public function testProcessVariadic() + { + $container = new ContainerBuilder(); + $container->register('foo', __NAMESPACE__.'\Foo'); + $definition = $container->register('fooVariadic', __NAMESPACE__.'\FooVariadic'); + $definition->setAutowired(true); + + $pass = new AutowirePass(); + $pass->process($container); + + $this->assertCount(1, $container->getDefinition('fooVariadic')->getArguments()); + $this->assertEquals('foo', (string) $container->getDefinition('fooVariadic')->getArgument(0)); + } + public function testProcessAutowireParent() { $container = new ContainerBuilder(); @@ -654,3 +668,14 @@ public function __construct($foo, Bar $bar, $baz) { } } + +class FooVariadic +{ + public function __construct(Foo $foo) + { + } + + public function bar(...$arguments) + { + } +} From 10d7f8795e3ed1ca0554d46c6ecda73e6e30a844 Mon Sep 17 00:00:00 2001 From: matze Date: Sun, 22 Jan 2017 16:43:00 +0100 Subject: [PATCH 2/3] [DependencyInjection] Fixed variadic method parameter in autowired classes PHP5.5 support... --- .../Compiler/AutowirePass.php | 3 ++- .../Tests/Compiler/AutowirePassTest.php | 17 +++++------------ .../Tests/Fixtures/includes/FooVariadic.php | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/FooVariadic.php diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index d496f1ee2c069..8549a3139a353 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -338,10 +338,11 @@ private static function getResourceMetadataForMethod(\ReflectionMethod $method) $class = false; } + $isVariadic = method_exists($parameter, 'isVariadic') && $parameter->isVariadic(); $methodArgumentsMetadata[] = array( 'class' => $class, 'isOptional' => $parameter->isOptional(), - 'defaultValue' => ($parameter->isOptional() && !$parameter->isVariadic()) ? $parameter->getDefaultValue() : null, + 'defaultValue' => ($parameter->isOptional() && !$isVariadic) ? $parameter->getDefaultValue() : null, ); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index 5ec3eafee2da0..b3f90696a5122 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -14,6 +14,7 @@ use Symfony\Component\DependencyInjection\Compiler\AutowirePass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Reference; +use Symfony\Component\DependencyInjection\Tests\Fixtures\includes\FooVariadic; /** * @author Kévin Dunglas @@ -35,11 +36,14 @@ public function testProcess() $this->assertEquals('foo', (string) $container->getDefinition('bar')->getArgument(0)); } + /** + * @requires PHP 5.6 + */ public function testProcessVariadic() { $container = new ContainerBuilder(); $container->register('foo', __NAMESPACE__.'\Foo'); - $definition = $container->register('fooVariadic', __NAMESPACE__.'\FooVariadic'); + $definition = $container->register('fooVariadic', FooVariadic::class); $definition->setAutowired(true); $pass = new AutowirePass(); @@ -668,14 +672,3 @@ public function __construct($foo, Bar $bar, $baz) { } } - -class FooVariadic -{ - public function __construct(Foo $foo) - { - } - - public function bar(...$arguments) - { - } -} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/FooVariadic.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/FooVariadic.php new file mode 100644 index 0000000000000..12861c5611735 --- /dev/null +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/FooVariadic.php @@ -0,0 +1,16 @@ + Date: Sun, 22 Jan 2017 20:07:16 +0100 Subject: [PATCH 3/3] [DependencyInjection] Fixed variadic method parameter in autowired classes change from code review --- .../DependencyInjection/Tests/Compiler/AutowirePassTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index b3f90696a5122..8fca41b603724 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -42,7 +42,7 @@ public function testProcess() public function testProcessVariadic() { $container = new ContainerBuilder(); - $container->register('foo', __NAMESPACE__.'\Foo'); + $container->register('foo', Foo::class); $definition = $container->register('fooVariadic', FooVariadic::class); $definition->setAutowired(true); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy