在laravel 4中,我可以使用queue::push(function...)
将一个闭包推到队列中,但这不再适用于laravel 5.相反,似乎我必须为我想要的每个函数创建一个自定义Job类推进队列。
由于我想要推动的功能只有几行,并且只在一个地方使用过,所以为每个案例写一个完整的类似乎浪费时间和空间。
最好的"解决方案"我现在可以想到,要么有一个辅助函数,它使用PHP的反射方法在被调用时动态生成一个新类,或者具有接受闭包作为参数的通用作业,即dispatch(new ClosureJob(function(){...}));
< / p>
这些对我来说似乎不太理想。还有另一种方法吗?或者我将不得不实施其中一种?
答案 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标准,这是您应该遵循的标准。