Laravel Notification 无法用纯 PHP 类复刻,因其深度依赖服务容器、事件调度、队列驱动、Notifiable trait 及统一分发机制;裸写 send() 方法仅能模拟单点发送,缺失通道路由、格式化、失败重试、动态 via() 选择等核心能力。

PHP 本身不提供 Notification 通知系统,Laravel 的 Notification 是框架层封装,不能脱离 Laravel 运行;所谓“PHP 实现”实际是指在 Laravel 应用中正确配置和扩展其多通道通知能力。
为什么直接写 PHP 类无法复刻 Laravel Notification?
Laravel 的 Notification 依赖服务容器、事件调度、队列驱动、Notifiable trait 和通道(MailChannel、DatabaseChannel 等)的统一分发机制。裸写一个 send() 方法只能模拟单点发送,缺失路由、格式化、失败重试、通道开关等关键能力。
- 没有
via()方法控制通道选择逻辑 - 无法自动绑定
$notifiable(用户/模型)与通知实例的上下文关系 - 数据库通知表
notifications结构、加密字段data、read_at时间戳等需手动维护 - 队列任务(
SendQueuedNotifications)无法被框架识别和调度
如何真正启用 Laravel 多通道通知(含自定义通道)?
核心是让通知类实现 ShouldQueue(可选),并正确定义 via() 返回通道数组,再注册自定义通道到 config/services.php 或服务提供者中。
-
via()必须返回字符串数组,如['mail', 'database', 'wechat'];Laravel 会依次调用对应Channel类的send() - 自定义通道(如钉钉、短信)需继承
Illuminate\Notifications\Channels\Channel或直接实现send()方法,并在App\Providers\AppServiceProvider::boot()中注册:Notification::extend('dingtalk', function ($app) { return new DingTalkChannel(); }); - 数据库通道要求模型使用
Notifiabletrait,且运行php artisan notifications:table && php artisan migrate - 邮件通道需提前配置
MAIL_MAILER(如smtp或log)并验证toMail()返回Mailable实例
常见报错与绕过陷阱
多数问题出在通道未注册、模型未声明可通知、或数据序列化失败。
立即学习“PHP免费学习笔记(深入)”;
- 报错
Call to undefined method App\Models\User::routeNotificationFor():说明模型未 useNotifiabletrait,或自定义通知路由方法名拼写错误(必须是routeNotificationFor{ChannelName}(),如routeNotificationForWechat()) - 数据库通知
data字段为空或乱码:检查通知类的toDatabase()是否返回数组(不能是对象,否则json_encode失败) - 队列通知不执行:确认
ShouldQueue接口已实现,且QUEUE_CONNECTION配置正确(如redis或database),并运行了php artisan queue:work - 邮件发送成功但收件人收不到:优先用
log驱动测试,查看storage/logs/laravel.log中是否记录了Sent mail to xxx,排除 SMTP 凭据或 TLS 设置问题
多通道的本质不是堆砌渠道,而是让每个通道承担它最擅长的事——邮件做正式凭证,数据库存操作快照,Webhook 触发外部系统。漏掉 via() 的动态判断逻辑,或把所有通道硬编码进数组,很快就会遇到推送爆炸或权限越界的问题。



















