如何正确处理所有Model的eloquent.deleted事件?
问题描述
我想在任意Model被删除后执行操作,目前的实现存在问题。删除前已获取Model,理论上应触发eloquent.deleted事件,我希望直接在AppServiceProvider中做通用处理,但监听器未生效,Laravel日志也无报错,怀疑监听方式有误。
原实现代码
AppServiceProvider.php
<?php namespace App\Providers; use App\Models\DebugLog; use App\Models\Jobs\JobLog; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Event; class AppServiceProvider extends ServiceProvider { /** * Register any application services. */ public function register(): void { // } /** * Bootstrap any application services. */ public function boot(): void { Event::listen('eloquent.deleted: *', function(string $eventName, array $data){ DebugLog::create([ 'function' => 'AppServiceProvider: Event eloquent.deleted', 'object' => json_encode($data,JSON_PRETTY_PRINT), 'message' => $eventName ]); //JobLog::where('tablename',$c_table)->where('entryid',$c_id)->delete(); }); } }
Model删除代码
$deletionSucc = InboundPlan::where('inboundplanid',$container->inboundplanid)->where('account',$container->__get('account'))->first()->delete();
我的解决方案
最终改用Trait处理,因为并非所有Model都需要触发该逻辑,且无需为每个相关Model单独添加代码。
JobLogDeletionTrait.php
<?php namespace App\Traits; use App\Models\DebugLog; use App\Models\Jobs\JobLog; trait JobLogDeletionTrait { public static function bootJobLogDeletionTrait() { static::deleting(function ($model) { $modelArr = $model->toArray(); $succ = JobLog::where('tablename',$model->getTable())->where('entryid',$modelArr[$model->getKeyName()])->delete(); }); static::deleted(function ($model) { $modelArr = $model->toArray(); $succ = JobLog::where('tablename',$model->getTable())->where('entryid',$modelArr[$model->getKeyName()])->delete(); }); } }
只需在需要触发逻辑的Model中引入该Trait即可,这种方式比监听所有Model删除事件更简洁。
内容的提问来源于stack exchange,提问作者MaxWeb
相关产品推荐
相关产品推荐

