首页 > 解决方案 > 使用 ShouldQueue 通知电子邮件序列化错误与缺少请求对象错误

问题描述

我有一个向一组收件人发送电子邮件的 Laravel Notification 类。没有ShouldQueue,这可以完美地使用$request我传递给Notification 类的构造函数的对象:

class MassNotification extends Notification {
     public function __construct($request)
     {
        $this->request = $request;
     }

这来自这样的控制器

\Notification::send($emps, new MassNotification($request));

我需要将这些电子邮件排队以释放用户继续前进,所以我实现ShouldQueue

class MassNotification extends Notification implements ShouldQueue {}

此时,消息失败并出现以下错误:

不允许序列化“闭包”

做一些SO search这里告诉我这是由于无法序列化$request对象。好的,我按照建议更改构造函数以拉入我需要的数据数组:

public function __construct($request)
 {
    $this->request = $request->all();
 }

我更改了我的代码toMail()以满足数组表示法与对象表示法,并且每次在到达toMail()方法之前都会失败:

在 /vagrant/app/Notifications/MassNotification.php:44 处调用一个成员函数 has() on null

然而,这指向我的代码——但我has()的代码中不再有,它永远不会到达那一行——Illuminate\\Notifications\\Channels\\MailChannel->send()我相信它失败了。

我试图完全取出请求数组,只使用变量(例如$this->message$this->subject等),但 Notification 似乎has()每次都在寻找要使用的对象。

我猜我错过了一些非常基本的东西,因为它不能被双向破坏。我将不胜感激。

标签: laravelnotificationsqueue

解决方案


如果您遇到代码更新未到位且错误与当前代码不匹配并且您正在使用排队作业的情况,则需要重新启动工作人员。队列工作程序以守护程序模式运行,并将应用程序的启动状态保存在内存中。他们不会看到您对代码所做的更改。

“请记住,队列工作者是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,它们在启动后不会注意到您的代码库中的更改。因此,在您的部署过程中,请务必重新启动您的排队工作人员。” - Laravel 6.x 文档 - 队列 - 运行队列工作器


推荐阅读