Laravel任意表数据更新时自动向管理员发送通知的实现方案咨询
Laravel全局监听模型数据更新自动发通知解决方案
原有中间件失效原因
- 逻辑执行顺序错误:
$next($request)才是执行控制器更新逻辑的入口,你在更新操作执行前就查询模型判断变更,自然无法拿到更新后的变更状态 - 全量查询所有客户数据逐一校验的逻辑性能极低,不适用于生产环境
可行解决方案
方案1:全局监听Eloquent更新事件(推荐,无需修改原有业务代码)
直接在框架的事件服务提供者中注册全局模型更新事件监听,所有Eloquent模型触发更新操作时都会自动执行通知逻辑:
- 打开
app/Providers/EventServiceProvider.php,在boot方法中添加如下代码:
use Illuminate\Database\Eloquent\Model; use App\Notifications\UpdateIsMade; use App\Models\User; public function boot() { parent::boot(); // 全局监听所有模型的更新完成事件 Model::updated(function (Model $model) { // 可在此处添加排除规则,过滤不需要监听的模型 // if (in_array(get_class($model), [\App\Models\Log::class])) return; // 获取变更字段与原始字段值 $changed = $model->getChanges(); $original = $model->getOriginal(); // 发送通知 $admin = User::where('profile_type', 'App\Admin')->first(); filled($admin) && $admin->notify(new UpdateIsMade($changed, $original)); }); }
- 配置完成后所有通过Eloquent模型
save()/update()方法触发的更新操作,都会自动触发通知,无需修改任何控制器原有代码。
方案2:模型观察者(适用于需要灵活控制监听范围的场景)
如果只需要监听部分模型的更新操作,可以用观察者模式统一管理逻辑:
- 执行命令生成通用观察者:
php artisan make:observer UpdateNotifyObserver - 编写观察者逻辑:
// app/Observers/UpdateNotifyObserver.php namespace App\Observers; use Illuminate\Database\Eloquent\Model; use App\Notifications\UpdateIsMade; use App\Models\User; class UpdateNotifyObserver { public function updated(Model $model) { $changed = $model->getChanges(); $original = $model->getOriginal(); $admin = User::where('profile_type', 'App\Admin')->first(); filled($admin) && $admin->notify(new UpdateIsMade($changed, $original)); } }
- 在
EventServiceProvider的boot方法中给需要监听的模型注册观察者即可:
public function boot() { \App\Models\Client::observe(\App\Observers\UpdateNotifyObserver::class); \App\Models\CompanyLawyer::observe(\App\Observers\UpdateNotifyObserver::class); \App\Models\CompanyFile::observe(\App\Observers\UpdateNotifyObserver::class); // 其余需要监听的模型逐一添加即可 }
注意事项
- 直接使用查询构造器执行的
update操作(如Client::where('id', 1)->update(['name' => 'xxx']))会跳过Eloquent模型流程,不会触发上述事件,需要触发时请改为先查询模型实例再调用save方法更新 - 可在事件逻辑中扩展自定义信息,比如当前操作人、所属模块、模型名称,方便管理员快速定位更新来源
- 建议将管理员账号查询结果写入缓存,避免每次触发事件都重复查询数据库
内容的提问来源于stack exchange,提问作者TAS
相关产品推荐
相关产品推荐

