模型事件监听必须定义在eloquent模型类的boot()方法中或通过服务提供者全局注册,写在控制器等处无效;creating在插入前可修改属性但无id,created在插入后有id但改属性不自动保存。
模型事件监听写在哪?不是在控制器里
模型事件监听必须定义在 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% 的“监听不生效”问题出在加载时机或条件判断上,而不是语法错误。