From 97c18802fb2231e6ca432955692e1dfdf2514080 Mon Sep 17 00:00:00 2001 From: Matheus Valim Date: Tue, 30 Sep 2014 13:51:40 +0000 Subject: [PATCH] make ->call also inject dependencies for calls with the @ sign based classnames --- src/Illuminate/Container/Container.php | 19 ++++++++++++++++--- tests/Container/ContainerTest.php | 13 +++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Container/Container.php b/src/Illuminate/Container/Container.php index 4daad82af73c..0aabbd26c330 100755 --- a/src/Illuminate/Container/Container.php +++ b/src/Illuminate/Container/Container.php @@ -523,14 +523,25 @@ public function call($callback, array $parameters = array(), $defaultMethod = nu return $this->callClass($callback, $parameters, $defaultMethod); } - $dependencies = []; + $dependencies = $this->getMethodDependencies($callback,$parameters); + return call_user_func_array($callback, $dependencies); + } + + /** + * Get all dependencies for a given method + * @param \Closure|array $callback + * @param array $parameters + * @return array + */ + protected function getMethodDependencies($callback,$parameters = array()) { + $dependencies = []; foreach ($this->getCallReflector($callback)->getParameters() as $key => $parameter) { $dependencies[] = $this->getDependencyForCallParameter($parameter, $parameters); } - return call_user_func_array($callback, $dependencies); + return array_merge($dependencies,$parameters); } /** @@ -601,7 +612,9 @@ protected function callClass($target, array $parameters = array(), $defaultMetho // received in this method into this listener class instance's methods. $callable = array($this->make($segments[0]), $method); - return call_user_func_array($callable, $parameters); + $dependencies = $this->getMethodDependencies($callable,$parameters); + + return call_user_func_array($callable, $dependencies); } /** diff --git a/tests/Container/ContainerTest.php b/tests/Container/ContainerTest.php index 2d7972783b0f..87ee3c354b51 100755 --- a/tests/Container/ContainerTest.php +++ b/tests/Container/ContainerTest.php @@ -378,6 +378,16 @@ public function testCallWithAtSignBasedClassReferences() $result = $container->call('ContainerTestCallStub@work', ['foo', 'bar']); $this->assertEquals(['foo', 'bar'], $result); + $container = new Container; + $result = $container->call('ContainerTestCallStub@inject'); + $this->assertInstanceOf('ContainerConcreteStub',$result[0]); + $this->assertEquals('taylor',$result[1]); + + $container = new Container; + $result = $container->call('ContainerTestCallStub@inject',['default'=>'foo']); + $this->assertInstanceOf('ContainerConcreteStub',$result[0]); + $this->assertEquals('foo',$result[1]); + $container = new Container; $result = $container->call('ContainerTestCallStub', ['foo', 'bar'], 'work'); $this->assertEquals(['foo', 'bar'], $result); @@ -500,6 +510,9 @@ class ContainerTestCallStub { public function work() { return func_get_args(); } + public function inject(ContainerConcreteStub $stub,$default = 'taylor') { + return func_get_args(); + } } class ContainerTestContextInjectOne {