Laravel Notification配置database渠道后数据未存入notifications表
Laravel Database通知渠道不生效排查方案
- 先确认已生成通知表并执行迁移
首先执行以下命令生成通知表迁移文件,再运行迁移:
确认数据库中存在php artisan notifications:table php artisan migratenotifications表,表结构字段完整。 - 检查通知调用方式是否正确
database渠道仅支持给引入了Illuminate\Notifications\NotifiableTrait的模型实例发送通知,调用方式必须为:
禁止使用// User模型需已引入Notifiable Trait $user->notify(new LoginNotification($user));Notification::route()路由通知的方式发送database渠道通知,该方式不支持持久化到数据库。 - 队列相关问题排查
你的通知类实现了ShouldQueue接口走队列投递,先临时将.env中的QUEUE_CONNECTION改为sync同步驱动测试:- 若修改后可以正常写入通知表:说明原队列驱动下worker未启动,或队列任务执行失败,可检查
failed_jobs表确认失败原因,启动队列worker即可:php artisan queue:work - 若修改后仍无法写入:继续向下排查
- 若修改后可以正常写入通知表:说明原队列驱动下worker未启动,或队列任务执行失败,可检查
- 修复toArray方法的上下文问题
队列进程中不存在session上下文,你当前代码中session('ip_address')在队列执行时无法获取到有效数据,可能触发隐性异常。修改逻辑:将IP参数在构造通知时就传入,不要在toArray中读取session:
通知类修改:
发通知时从请求实例获取IP传入:// 新增IP属性 public $ip; // 构造方法修改 public function __construct(User $user, string $ip) { $this->user = $user; $this->ip = $ip; } // toArray方法修改 public function toArray($notifiable) { return [ 'user' => $this->user->id, 'ip' => $this->ip, ]; }$user->notify(new LoginNotification($user, request()->ip())); - 检查是否存在通知拦截逻辑
查看App\Providers\EventServiceProvider中是否监听了Illuminate\Notifications\Events\NotificationSending事件,若有对应监听器,确认是否对database渠道做了过滤拦截,返回false会终止对应渠道的通知投递。 - 核对配置文件
检查config/notifications.php中database渠道的配置是否被修改,默认table配置应为notifications,和实际数据库表名一致。
内容的提问来源于stack exchange,提问作者Adefowowe
相关产品推荐
相关产品推荐

