0

0

Laravel观察者怎么用 Laravel Observer如何触发 【高级】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-08 11:37:02

|

923人浏览过

|

来源于php中文网

原创

observer方法名必须严格匹配事件名且首字母小写,如created;注册须在模型类加载后,推荐用eventserviceprovider的$observe属性;retrieved易致性能问题,耗时操作应交由队列处理。

laravel观察者怎么用 laravel observer如何触发 【高级】

Observer 方法名必须严格匹配事件名,且首字母小写

Observer 不是靠注解或配置驱动的,它依赖 Laravel 对方法名的反射调用。比如你想监听模型创建后的逻辑,必须定义 created 方法(不是 CreatedonCreatedhandleCreated)。Laravel 会自动把 User::create() 后触发的事件映射到观察者里同名的 public 方法上。

常见错误现象:retrieved 方法写了但日志没输出;updating 没生效——大概率是拼错了方法名,或加了多余参数(如 public function updated(User $user, $event)),而 Laravel 只传模型实例,不传事件对象。

  • creating / created:仅对 create()save() 新记录有效;update() 不触发
  • updating / updated:只在字段实际变更时触发(基于 isDirty()),但 touch()increment() 等操作不会走这些钩子
  • saving / saved:覆盖创建+更新,适合通用前置校验或统一埋点
  • deleting / deleted:硬删才触发;软删除需额外实现 forceDeleting 才能拦截 forceDelete()

注册 Observer 必须在模型类加载后执行,否则静默失效

很多人把 User::observe(UserObserver::class) 写在 AppServiceProvider::boot() 顶部,结果发现没反应——因为此时 User 类可能还没被自动加载,静态调用失败,Laravel 不报错也不提示。

正确做法是确保模型类已加载后再注册。最稳妥的方式是在 boot() 末尾或使用延迟闭包:

public function boot()
{
    // ✅ 推荐:显式 use,保证类加载
    use App\Models\User;
    use App\Observers\UserObserver;

    User::observe(UserObserver::class);
}

如果你用的是 Laravel 9+,还可以改用 EventServiceProvider$observe 属性注册,更集中、更安全:

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载
// app/Providers/EventServiceProvider.php
protected $observe = [
    User::class => [UserObserver::class],
];
  • 手动注册时,别在模型的 boot() 静态方法里调 observe(),那会形成循环依赖
  • 多个 Observer 可同时注册:User::observe([AObserver::class, BObserver::class])
  • 注册后无法取消(除非手动 User::flushEventListeners()),测试时注意隔离

retrieved 事件极易引发性能问题,慎用或主动屏蔽

retrieved 是唯一在「读取」阶段触发的事件,但它会在每次 get()first()paginate() 中的每条记录上都执行一次。查 100 条用户?它就调 100 次——哪怕你只是想在编辑单条时打个日志。

典型翻车场景:在 retrieved 里写 Log::info() 或调外部 API,结果首页分页一卡顿,监控里全是慢日志。

  • 真正需要时再启用:比如只在后台编辑页查单条,可用 withoutEvents() 全局禁用,再局部开启
  • 替代方案:用访问器(accessor)或资源(Resource)做展示层处理,别把展示逻辑塞进数据层
  • 如果非要用,务必加条件判断:if (request()->routeIs('users.edit')) { ... },但不如直接移出 Observer

耗时操作必须丢进队列,Observer 本身不支持异步

Observer 方法运行在 HTTP 请求生命周期内,同步执行。你在 created 里发邮件、调短信网关、生成缩略图,都会拖慢接口响应,甚至超时。

正确姿势是立刻 dispatch 一个 job,让队列 worker 异步处理:

public function created(User $user)
{
    SendWelcomeEmailJob::dispatch($user)->onQueue('emails');
}

别在 Observer 里写 sleep()file_get_contents()DB::transaction() 套娃等阻塞操作——它不是事务边界,也不是任务调度器。

  • Observer 是轻量级生命周期钩子,不是业务服务入口
  • 涉及跨模型、跨服务、重计算的逻辑,应抽成 Service 类,再由 Observer 或事件监听器调用
  • 如果要保证顺序(如先发短信再写日志),别依赖 Observer 方法顺序,用数据库状态 + 队列链式调度
Observer 最容易被当成“万能胶”往里塞逻辑,但它的定位很窄:只负责单一模型、轻量、同步、无副作用的响应。越想让它干更多事,就越容易掉进阻塞、重复、难测的坑里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

291

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

730

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

384

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

135

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

77

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

232

2026.03.04

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

46

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号