在laravel 5中任何方式派遣一个关闭?

时间:2017-06-07 09:42:36

标签: laravel-5 queue closures dispatch

在laravel 4中,我可以使用queue::push(function...)将一个闭包推到队列中,但这不再适用于laravel 5.相反,似乎我必须为我想要的每个函数创建一个自定义Job类推进队列。

由于我想要推动的功能只有几行,并且只在一个地方使用过,所以为每个案例写一个完整的类似乎浪费时间和空间。

最好的&#34;解决方案&#34;我现在可以想到,要么有一个辅助函数,它使用PHP的反射方法在被调用时动态生成一个新类,或者具有接受闭包作为参数的通用作业,即dispatch(new ClosureJob(function(){...})); < / p>

这些对我来说似乎不太理想。还有另一种方法吗?或者我将不得不实施其中一种?

3 个答案:

答案 0 :(得分:2)

我依靠OpisClosure库完成了这项工作。像这样扩展课程:

class QueueableClosure extends SerializableClosure
{
    public function handle() {
        call_user_func_array($this->closure, func_get_args());
    }
}

然后像这样使用它:

Queue::push(new QueueableClosure(function(){
    Log::debug("this is the QueueableClosure in action.");
}));

N.B。请参阅以下@Quezler中有关可能限制的评论!

答案 1 :(得分:0)

https://laravel.com/docs/5.0/queues#queueing-closures说:

  

您也可以将Closure推入队列。这对于需要排队的快速,简单任务非常方便:

     

将闭包放入队列

Queue::push(function($job) use ($id)
{
    Account::delete($id);

    $job->delete();
});

但是,我的猜测是您使用的是Laravel 5.3 + ,因为https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0表示:

  

不再支持队列关闭。如果要在应用程序中排队Closure,则应将Closure转换为一个类,并对该类的实例进行排队。

答案 2 :(得分:0)

从Laravel v5.7开始,您可以像这样将关闭队列排队:

$podcast = App\Podcast::find(1);

dispatch(function () use ($podcast) {
    $podcast->publish();
});

文档: https://laravel.com/docs/7.x/queues#queueing-closures

但是,强烈建议使用专用的作业类来提高代码质量,并更好地维护应用程序。想想您想检查队列中还有哪些任务,或者想控制特定代码应在哪个队列/连接上运行。

因此,您需要一个专门的工作类别: https://laravel.com/docs/5.7/queues#creating-jobs

我想说,编写专用的类几乎是Laravel标准,这是您应该遵循的标准。