0

0

Laravel中怎么实现模型事件监听_Laravel Model Events用法【详解】

冰火之心

冰火之心

发布时间:2026-02-08 12:33:43

|

687人浏览过

|

来源于php中文网

原创

模型事件监听必须定义在Eloquent模型类的boot()方法中或通过服务提供者全局注册,写在控制器等处无效;creating在插入前可修改属性但无ID,created在插入后有ID但改属性不自动保存。

laravel中怎么实现模型事件监听_laravel model events用法【详解】

模型事件监听写在哪?不是在控制器里

模型事件监听必须定义在 Eloquent 模型类内部,或通过服务提供者全局注册。写在控制器、中间件或路由闭包里完全无效——事件根本不会触发。

  • static::creating()static::saved() 这类静态方法调用,必须放在模型类的 boot() 方法中,且只能在模型被加载后执行(比如首次引用该模型时)
  • 如果用服务提供者注册(如 AppServiceProvider),需确保在 boot() 里调用,且模型类已自动加载(否则会报 Class not found
  • 别在模型构造函数里注册事件——此时模型还没初始化完成,static:: 调用会失败

creating 和 created 的区别到底在哪?

这两个事件都发生在插入数据库前/后,但关键差异在于事务状态和数据可用性:creating 是“即将插入但还没进 DB”,created 是“刚从 DB 返回、已带主键 ID”。

  • creating 中可以修改属性(如 $model->slug = Str::slug($model->name)),这些修改会进入 INSERT 语句;但不能访问 $model->id(因为还没生成)
  • created 中可以安全调用 $model->id、触发关联操作(如新建日志记录),但此时再改属性不会写回数据库(除非显式调用 save()
  • 若使用 DB::transaction()creating 在事务内,created 也在同一事务中;但 saving/saved 同理,而 deleting 不等同于 deleted:前者可 abort 删除(return false),后者不可逆

为什么事件没触发?常见断点检查清单

90% 的“监听不生效”问题出在加载时机或条件判断上,而不是语法错误。

SciMaster
SciMaster

全球首个通用型科研AI智能体

下载
  • 模型没继承 Illuminate\Database\Eloquent\Model —— 比如用了 Model 别名但忘了 use,会导致 static:: 调用静默失败
  • 事件注册写在了 __construct() 或普通方法里,而非 boot();或者 boot() 被重写但没调用 parent::boot()(Laravel 9+ 默认不强制要求,但自定义静态初始化逻辑时容易漏)
  • 用了 updateOrCreate()upsert():它们**不触发** creating/updating,只触发 saved(因为底层走的是 SQL UPDATE,非 Eloquent 生命周期)
  • 批量操作如 User::insert() 完全绕过模型事件——它直接执行 SQL,连模型实例都不创建

监听器里能干啥?哪些操作要特别小心

监听器本质是同步回调,所有代码都在当前请求生命周期内执行,没有队列兜底。

  • 避免在 created 里调用耗时外部 API(如发邮件、调第三方 webhook)——会拖慢响应,且失败无重试;应 dispatch 一个 Job 异步处理
  • 不要在 saving 里做数据库查询(比如根据 category_id 查分类名再塞进字段)——可能引发 N+1,更糟的是在事务中查未提交的数据,导致脏读
  • 监听器里抛出异常会中断整个保存流程(包括事务回滚),这有时是预期行为(如校验失败),但别依赖它做业务逻辑分支——用显式 if + return false 更清晰
  • retrieved 事件适合做属性转换(如解密字段),但它在每次 get()first()、甚至关系加载时都触发,高频场景下注意性能

事情说清了就结束。模型事件不是钩子集合,它是 Eloquent 生命周期的精确切片——错一个阶段,逻辑就滑到另一个世界。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

326

2024.04.09

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

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

283

2024.04.09

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

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

477

2024.04.09

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

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

377

2024.04.10

laravel入门教程
laravel入门教程

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

106

2025.08.05

laravel实战教程
laravel实战教程

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

74

2025.08.05

laravel面试题
laravel面试题

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

68

2025.08.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

857

2023.10.12

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.02.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号