如何在Laravel中结合Spatie Activitylog实现软删除日志记录?
正确配置Spatie Laravel Activitylog记录软删除操作
以下是解决问题的具体步骤和排查点:
1. 模型核心配置(关键)
确保你的模型同时启用SoftDeletes和LogsActivity trait,并开启软删除日志开关:
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Spatie\Activitylog\Traits\LogsActivity; class YourModel extends Model { use SoftDeletes, LogsActivity; // 方式1:记录所有fillable属性 protected $logFillable = true; // 方式2:指定要记录的属性数组 // protected $logAttributes = ['name', 'email']; // 必须开启这一行,默认是false,不记录软删除 protected static bool $logSoftDeletes = true; // 可选:自定义日志描述(让日志更易读) public function getDescriptionForEvent(string $eventName): string { return match($eventName) { 'deleted' => "软删除了ID为{$this->id}的模型", 'restored' => "恢复了ID为{$this->id}的模型", default => parent::getDescriptionForEvent($eventName), }; } }
2. 移除冲突的自定义观察者
如果你之前手动添加了模型观察者,且观察者的deleted方法没有正确处理软删除逻辑,可能会覆盖LogsActivity trait的默认行为。建议暂时移除自定义观察者,先测试默认配置是否生效。
如果必须保留观察者,需要在deleted方法中手动判断软删除并记录日志:
class YourModelObserver { public function deleted(YourModel $model) { // 仅在软删除时记录日志 if ($model->isSoftDeleted()) { activity() ->performedOn($model) ->withProperties(['original_attributes' => $model->getOriginal()]) ->log("软删除了模型(ID: {$model->id})"); } } }
3. 验证基础条件
- 确认模型的软删除功能本身正常:执行
$model->delete()后,数据库中deleted_at字段会被填充。 - 确认
activity_log表已正确生成:运行过Spatie包的迁移命令php artisan migrate,表中包含properties(JSON类型)等必要字段。 - 测试软删除操作:执行软删除后,直接查询
activity_log表,查看是否生成了event为deleted的日志条目。
内容的提问来源于stack exchange,提问作者Pavel Rahman
相关产品推荐
相关产品推荐

