恢复Eloquent模型时忽略更新的事件



我正在构建一个包,该包记录在雄辩上发生的更改,并试图找出在restored时忽略updated事件的检查内容。

trait HasLogs
{
public static function bootHasLogs(): void
{
// created ...
self::updated(callback: fn ($model) => self::log($model, 'updated'));
self::deleted(callback: function ($model) {
// Ignore 'deleted' event when 'softDeleted' or 'forceDeleted'
if (in_array('IlluminateDatabaseEloquentSoftDeletes', (class_uses(self::class)))) {
return;
}
self::log($model, 'deleted');
});
if (in_array('IlluminateDatabaseEloquentSoftDeletes', (class_uses(self::class)))) {
// softDeleted ...
self::restored(callback: fn ($model) => self::log($model, 'restored'));
// forceDeleted ...
}
}
// ...
}

如果有帮助的话,下面是行动顺序:

  1. CCD_ 3对CCD_
  2. ----CCD_ 5被激发
  3. ----Model::save()
  4. --------CCD_ 7被激发
  5. --------Model::performUpdate()
  6. ------------CCD_ 9被激发
  7. ------------Builder::update()
  8. ------------updated被触发
  9. --------Model::finishSave()
  10. ------------CCD_ 13被激发
  11. ----CCD_ 14被激发

特征HasLogs为默认设置为false的名为loggableIsBeingRestoredModel添加了一个布尔属性。

该特征还为restoring注册新的监听器,该监听器在所描述的动作的请求时将loggableIsBeingRestored设置为true

然后CCD_ 22监听器在继续其动作之前检查CCD_。

trait HasLogs
{
public bool $loggableIsBeingRestored = false;
public static function bootHasLogs(): void
{
// ...
self::updated(callback: function ($model) {
if (isset($model->loggableIsBeingRestored) && $model->loggableIsBeingRestored) {
// This is a restored event so don't log!
return;
}
self::log($model, 'updated');
});
// ...
self::restored(callback: function ($model) {
self::log($model, 'restored');
$model->loggableIsBeingRestored = false;
});
self::restoring(callback: function ($model) {
$model->loggableIsBeingRestored = true;
});
}
// ...
}

最新更新