diff --git a/src/Illuminate/Container/BoundMethod.php b/src/Illuminate/Container/BoundMethod.php index 3a614720fae9..5c96c973e0c8 100644 --- a/src/Illuminate/Container/BoundMethod.php +++ b/src/Illuminate/Container/BoundMethod.php @@ -172,7 +172,15 @@ protected static function addDependencyForCallParameter($container, $parameter, unset($parameters[$className]); } else { - $dependencies[] = $container->make($className); + if ($parameter->isVariadic()) { + $variadicDependencies = $container->make($className); + + $dependencies = array_merge($dependencies, is_array($variadicDependencies) + ? $variadicDependencies + : [$variadicDependencies]); + } else { + $dependencies[] = $container->make($className); + } } } elseif ($parameter->isDefaultValueAvailable()) { $dependencies[] = $parameter->getDefaultValue(); diff --git a/tests/Container/ContainerCallTest.php b/tests/Container/ContainerCallTest.php index e2a32a8955b0..694ccd511fcb 100644 --- a/tests/Container/ContainerCallTest.php +++ b/tests/Container/ContainerCallTest.php @@ -160,6 +160,29 @@ public function testCallWithDependencies() $this->assertSame('taylor', $result[1]); } + public function testCallWithVariadicDependency() + { + $stub1 = new ContainerCallConcreteStub; + $stub2 = new ContainerCallConcreteStub; + + $container = new Container; + $container->bind(ContainerCallConcreteStub::class, function () use ($stub1, $stub2) { + return [ + $stub1, + $stub2, + ]; + }); + + $result = $container->call(function (stdClass $foo, ContainerCallConcreteStub ...$bar) { + return func_get_args(); + }); + + $this->assertInstanceOf(stdClass::class, $result[0]); + $this->assertInstanceOf(ContainerCallConcreteStub::class, $result[1]); + $this->assertSame($stub1, $result[1]); + $this->assertSame($stub2, $result[2]); + } + public function testCallWithCallableObject() { $container = new Container;