via()返回值必须严格匹配已注册渠道名,否则Laravel静默忽略通知;notifications表需添加notifiable_id+notifiable_type联合索引以提升查询性能。
通知发不出去,八成是写错了,不是配置问题,也不是队列没跑,而是 Laravel 直接跳过发送——连日志都不打。
via() 返回值必须严格匹配已注册渠道名
这个方法是通知的“开关”,不是装饰。返回空数组、拼错名字(比如
)、或写了没装包的渠道(比如
但没
),Laravel 就静默忽略整条通知。
→ 需已配
,且
方法存在
→ 需先执行
→ 两个方法都得实现:
和
→ 类必须实现
,且
存在
数据库通知查得慢?缺索引是硬伤
用户通知量一过几千,
就卡顿,根本不是 PHP 或 Redis 的问题,是
表没建联合索引。
必须加
联合索引,这是按用户查通知的命脉
如果还常做“未读筛选”,再加
复合索引
字段是 JSON 序列化存的,别指望用
查内容——它不走索引,查得越深越慢
广播通知收不到?前端订阅和后端频道类型必须咬死
广播失败极少是驱动没配对,更多是频道类型、鉴权路径、前端订阅三者没对齐。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
私有频道(
)必须走鉴权:前端订阅时触发
,后端得返回 200 + auth token
频道名要完全一致:通知类里
返回的
和前端
必须字面匹配
别漏掉
里的
,否则鉴权路由压根不存在
标记已读别先 find() 再 markAsRead()
常见写法
看似自然,实则多一次查询。
直接用
,一行搞定,省 DB 查询
批量标记也一样:
如果只是想取未读数,
比
更快——前者走缓存关系,后者走 SQL
最易被忽略的是
的返回值校验和
表索引补全。这两个点不处理,其他所有配置都白搭。
via()'mails''vonage'composer require vonage/laravelreturn ['mail']MAIL_MAILERtoMail()return ['database']php artisan notifications:table && php artisan migratereturn ['mail', 'database']toMail()toDatabase()return ['broadcast']ShouldBroadcasttoBroadcast()$user->unreadNotificationsnotificationsnotifiable_id + notifiable_typenotifiable_id + notifiable_type + read_atdatawhereJsonContains()private-user.123/api/broadcasting/authtoBroadcast()onConnection('redis')channel('private-user.123')App\Providers\BroadcastServiceProviderBroadcast::routes()$notification = $user->notifications()->find($id); $notification->markAsRead();$user->notifications()->where('id', $id)->markAsRead()$user->notifications()->whereIn('id', $ids)->markAsRead()$user->unreadNotifications->count()$user->notifications()->whereNull('read_at')->count()via()notifications