From 0f9d41eaa913affb3e20a5e884b8c859c88c33bc Mon Sep 17 00:00:00 2001 From: Wing Lian Date: Sun, 15 Feb 2015 13:41:43 -0500 Subject: [PATCH 1/2] Allow dependencies to be resolved out of the IoC for Queued Event Handlers --- src/Illuminate/Events/CallQueuedHandler.php | 34 +++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Illuminate/Events/CallQueuedHandler.php b/src/Illuminate/Events/CallQueuedHandler.php index 3422e0fabfd1..10278b770207 100644 --- a/src/Illuminate/Events/CallQueuedHandler.php +++ b/src/Illuminate/Events/CallQueuedHandler.php @@ -2,6 +2,7 @@ use Illuminate\Contracts\Queue\Job; use Illuminate\Contracts\Container\Container; +use ReflectionMethod; class CallQueuedHandler { @@ -36,8 +37,10 @@ public function call(Job $job, array $data) $job, $this->container->make($data['class']) ); - call_user_func_array( - [$handler, $data['method']], unserialize($data['data']) + $jobData = unserialize($data['data']); + $this->parameterizeJobDataDependencies($handler, $data['method'], $jobData); + $this->container->call( + [$handler, $data['method']], $jobData ); if ( ! $job->isDeletedOrReleased()) @@ -46,6 +49,33 @@ public function call(Job $job, array $data) } } + /** + * Convert the job data into named parameters that the IoC container can use to resolve dependencies + * + * @param object $handler + * @param string $method + * @param array $data + * @return void + */ + protected function parameterizeJobDataDependencies($handler, $method, &$data) + { + foreach ((new ReflectionMethod($handler, $method))->getParameters() as $callbackKey => $callbackParameter) { + $callbackParameterClass = ($callbackParameter->getClass()) ? $callbackParameter->getClass()->name : null; + if (empty($callbackParameterClass)) + continue; + $callbackParameterName = $callbackParameter->name; + foreach ($data as $dataKey => &$possibleParameter) { + if (!is_object($possibleParameter) || !is_numeric($dataKey)) + continue; + if (get_class($possibleParameter) == $callbackParameterClass) { + $data[$callbackParameterName] = $possibleParameter; + unset($data[$dataKey]); + } + } + unset($possibleParameter); + } + } + /** * Set the job instance of the given class if necessary. * From b8eea03d5014df626087411e7f56f18b9d99d611 Mon Sep 17 00:00:00 2001 From: Wing Lian Date: Sun, 15 Feb 2015 14:07:00 -0500 Subject: [PATCH 2/2] correct the braces --- src/Illuminate/Events/CallQueuedHandler.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Illuminate/Events/CallQueuedHandler.php b/src/Illuminate/Events/CallQueuedHandler.php index 10278b770207..fb717e67be1a 100644 --- a/src/Illuminate/Events/CallQueuedHandler.php +++ b/src/Illuminate/Events/CallQueuedHandler.php @@ -59,15 +59,22 @@ public function call(Job $job, array $data) */ protected function parameterizeJobDataDependencies($handler, $method, &$data) { - foreach ((new ReflectionMethod($handler, $method))->getParameters() as $callbackKey => $callbackParameter) { + foreach ((new ReflectionMethod($handler, $method))->getParameters() as $callbackKey => $callbackParameter) + { $callbackParameterClass = ($callbackParameter->getClass()) ? $callbackParameter->getClass()->name : null; if (empty($callbackParameterClass)) + { continue; + } $callbackParameterName = $callbackParameter->name; - foreach ($data as $dataKey => &$possibleParameter) { + foreach ($data as $dataKey => &$possibleParameter) + { if (!is_object($possibleParameter) || !is_numeric($dataKey)) + { continue; - if (get_class($possibleParameter) == $callbackParameterClass) { + } + if (get_class($possibleParameter) == $callbackParameterClass) + { $data[$callbackParameterName] = $possibleParameter; unset($data[$dataKey]); }