Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】
发布时间 - 2026-01-01 00:00:00 点击率:次Laravel的观察者模式本质是模型事件的封装机制,Observer类通过反射将静态方法映射到对应生命周期钩子,依赖dispatchesEvents或自动注册机制触发,不监听任何东西。
直接说结论:Laravel 的「观察者模式」本质是模型事件(Model Events)的封装机制,Observer 类本身不监听任何东西,它只是把一堆 static 方法映射到对应模型生命周期钩子上——真正起作用的是 dispatchesEvents 或自动注册机制。
Observer 是怎么被 Laravel 自动调用的?
Laravel 不靠 PHP 的 SPL 观察者,而是靠模型事件分发 + 反射调用。当你执行 php artisan make:observer UserObserver --model=User,生成的类里每个方法名(如 created、updated)必须和模型支持的事件名完全一致,且首字母小写。
关键点在
于注册方式:
- 手动注册:在
AppServiceProvider::boot()里调用User::observe(UserObserver::class) - 自动注册(Laravel 9+):只要在
boot()中调用Observes::register()并传入模型与观察者映射,或使用EventServiceProvider的$observe属性(推荐) - 注意:观察者方法接收的是模型实例,不是事件对象;没有
$event参数
哪些模型事件能被 Observer 捕获?
只有 Eloquent 定义的 10 个标准事件可用,比如 creating、created、updating、updated、saving、saved 等。自定义事件(如 user.login)不会触发 Observer 方法。
特别注意两个易错点:
-
creating和created区别:前者在写入数据库前(可修改属性、返回false中断保存),后者在插入成功后(已含id,但事务未提交) -
retrieved仅在首次从数据库取数据时触发,Eager loading关系数据不会触发它 -
deleting阶段还能访问模型关联数据;deleted阶段关联可能已释放(取决于是否用了withTrashed())
Observer 和 Model Events 直接监听的区别?
Observer 是语法糖,底层仍走 Event::dispatch()。但二者注册位置和优先级不同:
use Illuminate\Database\Eloquent\Model;
// 方式一:在模型内硬编码(不推荐)
protected $dispatchesEvents = [
'created' => UserCreated::class,
];
// 方式二:全局监听(更灵活,支持队列、中间件)
Event::listen(UserCreated::class, function (UserCreated $event) {
// ...
});
// 方式三:Observer(语义清晰,适合同域逻辑)
class UserObserver
{
public function created(User $user)
{
// 同步发邮件、记录日志等轻量操作
Mail::to($user)->send(new WelcomeMail());
}
}
性能提示:
- Observer 方法默认同步执行,若含 HTTP 请求、文件写入或耗时 DB 查询,应改用事件 + 队列
- 多个 Observer 注册同一模型时,按注册顺序执行,无内置优先级控制
- 如果在
saving中修改了模型字段,需手动调用$model->setDirty('field')才会真正更新到数据库
为什么 Observer 方法没执行?常见排查路径
不是代码写错了,大概率是注册漏了或时机不对:
- 检查是否在
AppServiceProvider::boot()中调用了Model::observe(Observer::class),且该调用不在if (app()->runningInConsole())分支里(否则 Web 请求不生效) - 确认模型没有设置
protected $dispatchesEvents = []清空了默认事件映射 - 运行
php artisan tinker,手动触发一次User::create([...]),看是否报错或静默失败 - 观察者方法名拼写错误(如写成
Created或onCreated)——Laravel 不会警告,直接跳过 - 使用了
DB::table('users')->insert(...):绕过了 Eloquent,Observer 完全不触发
最常被忽略的一点:Observer 只响应模型类自身的操作。如果你在 Repository 或 Service 里 new 了一个模型但没调用 save(),或者用了 updateOrCreate() 却忘了它内部仍走 Eloquent 生命周期——这些都得实测验证,不能只看代码有没有 save 字样。
# php
# laravel
# 编码
# app
# ai
# 区别
# 为什么
# Static
# if
# 封装
# register
# 堆
# class
# protected
# Event
# 对象
# 事件
# table
# 数据库
# http
# 的是
# 用了
# 首次
# 多个
# 还能
# 才会
# 是怎么
# 你在
# 当你
# 错了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
长沙企业网站制作哪家好,长沙水业集团官方网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
手机网站制作与建设方案,手机网站如何建设?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何快速搭建高效服务器建站系统?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
香港服务器如何优化才能显著提升网站加载速度?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel观察者模式如何使用_Laravel Model Observer配置
linux写shell需要注意的问题(必看)
如何在万网主机上快速搭建网站?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
用v-html解决Vue.js渲染中html标签不被解析的问题
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Android自定义控件实现温度旋转按钮效果
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
香港服务器部署网站为何提示未备案?
详解jQuery中的事件
重庆市网站制作公司,重庆招聘网站哪个好?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel怎么判断请求类型_Laravel Request isMethod用法
php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
canvas 画布在主流浏览器中的尺寸限制详细介绍
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
,在苏州找工作,上哪个网站比较好?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
七夕网站制作视频,七夕大促活动怎么报名?
如何用IIS7快速搭建并优化网站站点?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
太平洋网站制作公司,网络用语太平洋是什么意思?
如何彻底删除建站之星生成的Banner?
简历在线制作网站免费版,如何创建个人简历?
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
微信小程序 canvas开发实例及注意事项
Python自动化办公教程_ExcelWordPDF批量处理案例
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何在建站之星绑定自定义域名?
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
如何在阿里云高效完成企业建站全流程?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何基于云服务器快速搭建网站及云盘系统?

