You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Notification配置database渠道后数据未存入notifications表

Laravel Database通知渠道不生效排查方案
  • 先确认已生成通知表并执行迁移
    首先执行以下命令生成通知表迁移文件,再运行迁移:
    php artisan notifications:table
    php artisan migrate
    
    确认数据库中存在notifications表,表结构字段完整。
  • 检查通知调用方式是否正确
    database渠道仅支持给引入了Illuminate\Notifications\Notifiable Trait的模型实例发送通知,调用方式必须为:
    // User模型需已引入Notifiable Trait
    $user->notify(new LoginNotification($user));
    
    禁止使用Notification::route()路由通知的方式发送database渠道通知,该方式不支持持久化到数据库。
  • 队列相关问题排查
    你的通知类实现了ShouldQueue接口走队列投递,先临时将.env中的QUEUE_CONNECTION改为sync同步驱动测试:
    • 若修改后可以正常写入通知表:说明原队列驱动下worker未启动,或队列任务执行失败,可检查failed_jobs表确认失败原因,启动队列worker即可:php artisan queue:work
    • 若修改后仍无法写入:继续向下排查
  • 修复toArray方法的上下文问题
    队列进程中不存在session上下文,你当前代码中session('ip_address')在队列执行时无法获取到有效数据,可能触发隐性异常。修改逻辑:将IP参数在构造通知时就传入,不要在toArray中读取session:
    通知类修改:
    // 新增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,
        ];
    }
    
    发通知时从请求实例获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:45:03