如何搭配database队列连接使用Laravel通知的toArray或toDatabase方法
Laravel 通知
toArray()/toDatabase()配合database队列使用问题说明 首先明确结论:toArray()和toDatabase()方法本身完全支持database队列连接,不存在官方未提及的兼容性限制,你遇到的无法写入数据的问题均为配置或代码规范问题导致,可按照以下方向排查:
确认database队列worker已正常启动
sync队列是同步执行无需额外进程,但是database队列需要手动启动worker消费任务才会执行通知的落库逻辑,启动命令为:php artisan queue:work database如果你修改了通知类相关代码,必须执行
php artisan queue:restart重启队列进程,否则旧进程会沿用修改前的代码逻辑,导致改动不生效。检查通知类序列化配置是否正确
异步队列执行时会先将通知类实例序列化后存入队列表,消费时再反序列化执行,存在两类常见错误会导致执行失败:- 通知类未引入
SerializesModelstrait:如果你的通知构造方法传入了Eloquent模型实例,必须引入该trait保证模型序列化、反序列化正常 - 构造方法传入了不可序列化的资源类型:比如文件句柄、CURL连接等资源类型无法序列化,会导致队列任务执行异常。
- 通知类未引入
排查失败队列报错信息
执行失败的队列任务会默认存入failed_jobs表,查看表中对应任务的exception字段内容,可直接定位具体错误原因,比如权限不足、数据库连接异常、方法不存在等直观报错。核对通知类基础配置
确认通知类的via()方法返回值包含database通道,不存在条件判断导致异步执行时上下文不匹配、未触发database通道逻辑的问题。
以下是符合队列异步执行规范的通知类示例:
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Notification; use Illuminate\Queue\SerializesModels; class CustomNotification extends Notification implements ShouldQueue { // 必须引入Queueable和SerializesModels两个trait use Queueable, SerializesModels; protected $customData; public function __construct(array $customData) { $this->customData = $customData; } public function via($notifiable) { // 确保返回database通道 return ['database']; } public function toArray($notifiable) { return [ 'title' => $this->customData['title'], 'content' => $this->customData['content'] ]; } }
内容的提问来源于stack exchange,提问作者Adefowowe
相关产品推荐
相关产品推荐

