laravel - 使用 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()
每次都在寻找要使用的对象。
我猜我错过了一些非常基本的东西,因为它不能被双向破坏。我将不胜感激。
解决方案
如果您遇到代码更新未到位且错误与当前代码不匹配并且您正在使用排队作业的情况,则需要重新启动工作人员。队列工作程序以守护程序模式运行,并将应用程序的启动状态保存在内存中。他们不会看到您对代码所做的更改。
“请记住,队列工作者是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,它们在启动后不会注意到您的代码库中的更改。因此,在您的部署过程中,请务必重新启动您的排队工作人员。” - Laravel 6.x 文档 - 队列 - 运行队列工作器
推荐阅读
- node.js - 查询结果是否始终具有相同的元数据结构?
- ruby-on-rails - 无法上传类型为 application/* 的回形针中的不同文件
- ios - 无论如何在iOS上找到一个孤立对象的所有者?
- spring-data-jpa - 使用 spring-data-rest 处理 @CreatedBy、@CreatedAt、@ChangedBy、@ChangedAt 和 @Version 字段
- azure-cognitive-search - Azure 搜索查询限制
- php - 如果参数数量不同,array_combine 不起作用
- dart - 如何读取此值并将其分配给 sqlite Flutter 中的变量?
- scala - 如何在intelliJ中调试scala spark代码
- hsqldb - HSQLDB 使用嵌套查询时触发 OutOfMemoryError 并且 DB 处于只读模式
- spring-boot - Spring Boot 中的 HTTP 响应过滤器