You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel任意表数据更新时自动向管理员发送通知的实现方案咨询

Laravel全局监听模型数据更新自动发通知解决方案

原有中间件失效原因

  • 逻辑执行顺序错误:$next($request)才是执行控制器更新逻辑的入口,你在更新操作执行前就查询模型判断变更,自然无法拿到更新后的变更状态
  • 全量查询所有客户数据逐一校验的逻辑性能极低,不适用于生产环境

可行解决方案

方案1:全局监听Eloquent更新事件(推荐,无需修改原有业务代码)

直接在框架的事件服务提供者中注册全局模型更新事件监听,所有Eloquent模型触发更新操作时都会自动执行通知逻辑:

  1. 打开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));
    });
}
  1. 配置完成后所有通过Eloquent模型save()/update()方法触发的更新操作,都会自动触发通知,无需修改任何控制器原有代码。

方案2:模型观察者(适用于需要灵活控制监听范围的场景)

如果只需要监听部分模型的更新操作,可以用观察者模式统一管理逻辑:

  1. 执行命令生成通用观察者:php artisan make:observer UpdateNotifyObserver
  2. 编写观察者逻辑:
// 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));
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 13:06:04