【问题标题】:Any way to dispatch a closure in laravel 5?有什么方法可以在 laravel 5 中发送闭包?
【发布时间】:2017-11-08 14:12:24
【问题描述】:

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

由于我要推送的函数只有几行长,而且只在一个地方使用过,为每个案例编写一个完整的类似乎真的是浪费时间和空间。

我目前能想到的最好的“解决方案”,要么有一个辅助函数,它使用 PHP 的反射方法在调用时动态生成一个新类,要么有一个接受闭包作为参数的通用作业,即@987654322 @

这些对我来说似乎不太理想。还有另一种方法可以做到这一点吗?还是我必须实施其中之一?

【问题讨论】:

  • 你最后是怎么解决的?
  • @GGGforce 每个函数的自定义作业。我现在有大约30个。只是因为它比尝试做一些聪明的事情更容易。
  • 我明白了。在下面查看我的答案,也许它会有所帮助。

标签: laravel-5 queue closures dispatch


【解决方案1】:

我已经通过依赖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.");
}));

注意请参阅@Quezler 下面关于可能限制的评论!

【讨论】:

【解决方案2】:

从 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 的标准,这就是你应该遵循的。

【讨论】:

    【解决方案3】:

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

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

    将闭包推入队列

    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 说:

    不再支持排队闭包。如果您在应用程序中对闭包进行排队,则应将闭包转换为类并将该类的实例排队。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多