Laravel 12 的模型观察者必须显式注册才能生效,框架不自动扫描app/Observers/目录;需在AppServiceProvider::boot()中调用User::observe(UserObserver::class)完成注册,且仅响应模型实例的save/create/update等操作,不触发批量更新、原生查询或upsert。

Laravel 12 的模型观察者(Observer)必须显式注册才能监听数据变更事件,框架不会自动加载或扫描 app/Observers/ 下的类。注册不正确,created、updated 等方法就完全不会执行。
在 AppServiceProvider 中统一注册
这是最常用、推荐的方式,适合多数项目结构:
- 打开
app/Providers/AppServiceProvider.php - 在
use区添加对应模型和观察者类,例如:use App\Models\User;use App\Observers\UserObserver; - 在
boot()方法中调用observe():User::observe(UserObserver::class);
注意:确保模型类已加载(放在 boot() 内即可),且每种模型需单独调用一次 observe(),不能传数组。
在模型自身的 boot 方法中注册
适用于该观察者只服务于单一模型、且希望逻辑强耦合的场景:
- 在模型类(如
User.php)的boot()静态方法中注册:protected static function boot()<br>{<br> parent::boot();<br> static::observe(UserObserver::class);<br>} - 这种方式避免了服务提供者依赖,但不利于跨模型复用观察者逻辑。
确认注册是否生效的关键点
常见“不触发”的根本原因往往出在注册环节:
- 生成观察者后没注册 ——
php artisan make:observer UserObserver --model=User只是创建文件,不等于启用 - 注册语句写在了
register()而非boot(),导致模型类尚未加载,报Class 'User' not found - 注册顺序冲突:若模型已通过
static::created(...)直接绑定了闭包事件,再调observe()可能被覆盖或延迟执行 - 观察者方法名拼写错误(如
create写成created少字母),Laravel 不报错也不调用
哪些数据变更事件能被观察者捕获
观察者只响应**基于模型实例的操作**,对批量更新、原生查询等无效:
- ✅ 触发事件的操作:
•$user->name = 'A'; $user->save();
•$user->update(['email' => 'x@example.com']);
•User::create([...]); - ❌ 不触发事件的操作:
•User::where('id', 1)->update([...]);
•DB::table('users')->update([...]);
•User::upsert([...]);(Laravel 9+)
如果业务中大量使用批量更新又需响应变更,建议改用模型循环 + save(),或在业务层主动调用自定义钩子方法,不要依赖观察者兜底。


















