laravel如何利用模型事件(Model Events)触发动作_Laravel模型事件触发动作方法
发布时间 - 2025-10-02 00:00:00 点击率:次Laravel模型事件可在Eloquent模型生命周期中触发自定义逻辑,如创建、更新、删除等操作。1. 内置事件包括retrieved、creating/created、updating/updated、saving/saved、deleting/deleted及软删除恢复相关事件,适用于日志记录、通知发送和缓存清理等场景。2. 可在模型的boot方法中直接注册事件回调,适合简单逻辑,例如创建后记录日志、更新后清除缓存、删除时移除关联数据。3. 当逻辑复杂时推荐使用观察者模式,通过artisan命令生成观察者并在AppServiceProvider中注册,将处理逻辑分离到独立类中,提升可维护性与测试便利性。4. 常见应用场景包括操作审计、缓存管理、消息通知、级联删除和搜索索引同步。根据项目规模选择回调或观察者模式,核心是将副作用逻辑从控制器解耦,交由模型事件统一处理。
Laravel 的模型事件(Model Events)允许你在 Eloquent 模型生命周期的特定时刻自动执行某些操作,比如创建、更新、删除或查询时触发自定义逻辑。通过合理使用模型事件,你可以解耦业务代码,提升可维护性。
1. 什么是 Laravel 模型事件
Eloquent 提供了多个内置事件,可在模型状态变化时被监听:
- retrieved:从数据库获取记录后触发
- creating / created:插入前/插入后触发
- updating / updated:更新前/更新后触发
- saving / saved:保存前/保存后(包括新增和更新)
- deleting / deleted:删除前/删除后
- restoring / restored:软删除恢复过程中触发
这些事件可用于记录日志、发送通知、缓存清理等场景。
2. 在模型中直接使用事件回调
最简单的方式是在模型的 boot 方法中注册事件监听:
class Article extends Model
{
protected static function boot()
{
parent::boot();
static::created(function ($article) {
\Log::info("新文章已创建: {$article->title}");
});
static::updated(function ($article) {
\Cache::forget("article_{$article->id}");
});
static::deleted(function ($article) {
// 删除相关评论
$article->comments()->delete();
});
}
}
这种写法适合逻辑简单、仅与当前模型相关的操作。
3. 使用观察者(Observers)分离逻辑
当事件处理逻辑变复杂时,推荐使用观察者模式来保持模型干净。
生成观察者:
php artisan make:observer ArticleObserver --model=Article
注册观察者: 在 AppServiceProvider 中:
use App\Models\Article;
use App\Observers\ArticleObserver;
public function boot()
{
Article::observe(ArticleObserver::class);
}
编写观察者逻辑:
class ArticleObserver
{
public function created(Article $article)
{
\Mail::to($article->author->email)->send(
new NewArticlePublished($article)
)
;
}
public function updating(Article $article)
{
if ($article->isDirty('status') && $article->status === 'published') {
$article->published_at = now();
}
}
}
观察者让事件处理更清晰,便于测试和维护。
4. 常见应用场景
- 日志记录:用户操作、数据变更审计
- 缓存管理:模型更新后清除对应缓存
- 消息通知:订单创建后发送邮件或短信
- 关联清理:主模型删除时级联删除子数据
- 搜索索引同步:配合 Scout 更新 Algolia 或 Meilisearch
基本上就这些方法,根据项目规模选择直接回调或观察者模式即可。关键是把副作用逻辑从控制器中剥离出来,交给模型事件统一管理。
# php
# laravel
# go
# app
# ai
# red
# 事件
# 数据库
# 回调
# 可在
# 推荐使用
# 自定义
# 级联
# 是在
# 你可以
# 多个
# 你在
# 适用于
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
iOS UIView常见属性方法小结
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法
文字头像制作网站推荐软件,醒图能自动配文字吗?
昵图网官方站入口 昵图网素材图库官网入口
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何选择可靠的免备案建站服务器?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何解决hover在ie6中的兼容性问题
Bootstrap整体框架之CSS12栅格系统
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何在宝塔面板中创建新站点?
悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音
Angular 表单中正确绑定输入值以确保提交与验证正常工作
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
C语言设计一个闪闪的圣诞树
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
Laravel如何配置任务调度?(Cron Job示例)
如何快速查询网址的建站时间与历史轨迹?
php 三元运算符实例详细介绍
微信小程序 五星评分(包括半颗星评分)实例代码
浅谈javascript alert和confirm的美化
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel如何使用Sanctum进行API认证?(SPA实战)
移动端脚本框架Hammer.js
如何在VPS电脑上快速搭建网站?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
用v-html解决Vue.js渲染中html标签不被解析的问题
黑客如何利用漏洞与弱口令入侵网站服务器?
如何在万网开始建站?分步指南解析
Laravel如何实现文件上传和存储?(本地与S3配置)
如何在Ubuntu系统下快速搭建WordPress个人网站?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】
在centOS 7安装mysql 5.7的详细教程
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
手机软键盘弹出时影响布局的解决方法
怎样使用JSON进行数据交换_它有什么限制
详解jQuery中的事件
php json中文编码为null的解决办法
使用C语言编写圣诞表白程序
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
如何在服务器上三步完成建站并提升流量?
上一篇: 买房网站制作流程,上海限购政策官网?
下一篇:建站模板如何优化才能节省空间?
上一篇: 买房网站制作流程,上海限购政策官网?
下一篇:建站模板如何优化才能节省空间?


;
}
public function updating(Article $article)
{
if ($article->isDirty('status') && $article->status === 'published') {
$article->published_at = now();
}
}
}