跳转到主要内容

什么是 Notification

Laravel 的通知(Notification)系统提供了统一的 API,可以向邮件、SMS、Slack、数据库等多个渠道发送通知。 Mail 与 Notification 的区别 像“发票已支付”这类需要向多个渠道发送同一条通知的场景,Notification 更合适。

创建 Notification 类

使用 make:notification Artisan 命令生成通知类。
生成的类位于 app/Notifications/。类中包含 via() 方法以及为各个渠道生成消息的方法。

发送通知的方式

使用 Notifiable trait

App\Models\User 默认已经包含了 Notifiable trait,可以用 notify() 方法发送通知。
Notifiable trait 并不限于 User 模型,任何模型都可以添加它。

使用 Notification Facade

要同时向多个用户发送,可以使用 Notification Facade。
要立即发送(跳过队列),可以使用 sendNow()

指定发送渠道

via() 方法以数组形式返回要使用的渠道。
也可以根据用户偏好切换渠道。
主要可用渠道如下。

邮件渠道通知

toMail() 方法返回一个 MailMessage 实例。
MailMessage 的常用方法如下: 如果是错误通知,可以加上 error(),按钮会变红。

Markdown 通知邮件

也可以使用 Markdown 编写更丰富的邮件。加上 --markdown 选项生成类。
使用 toMarkdownMail() 代替 toMail()

数据库渠道通知

数据库渠道可以把通知保存到数据库,并在应用 UI 中展示。

准备表结构

先创建 notifications 表。

定义 toArray 方法

toArray() 方法以数组形式返回要保存的数据。
这些数据会以 JSON 存放在 notifications 表的 data 列中。

获取通知

Notifiable trait 提供 notifications 关联,可用于读取通知。
要只获取未读通知,使用 unreadNotifications

标记为已读

使用 markAsRead() 将通知标为已读。

通知的队列化

如果通知发送耗时较长,可以实现 ShouldQueue 接口并使用 Queueable trait,将通知放到队列中。make:notification 生成的类默认已经导入了它们。
实现 ShouldQueue 后,调用 notify() 时通知会自动进入队列。
也支持延迟发送。

同时向多个渠道发送

只要在 via() 中返回多个渠道并各自定义方法,就可以同时向多个渠道发送同一条通知。

按需通知(On-demand notifications)

要向没有账号的人发送通知,可以使用 Notification::route()

小结

最后修改于 2026年7月18日