📜  spatie laravel-activitylog 仅显示更改的数据 - PHP (1)

📅  最后修改于: 2023-12-03 15:35:02.369000             🧑  作者: Mango

使用 Spatie Laravel Activitylog 仅显示更改的数据

简介

Spatie Laravel Activitylog 是一个强大的 Laravel 扩展包,用于记录模型的操作日志。它可以轻松地记录模型的创建、更新、删除等操作,并且提供了丰富的功能,比如版本控制、事件广播等。

在默认情况下,Spatie Laravel Activitylog 会记录模型的全部属性,包括被更改的和未被更改的属性。有时候,我们只想记录被更改的属性,这时可以使用该扩展包提供的 properties()oldProperties() 方法,仅记录被更改的属性和旧属性。

使用方法
安装

首先,需要使用 Composer 安装 Spatie Laravel Activitylog:

composer require spatie/laravel-activitylog

然后,根据 Laravel 版本执行下面的命令:

# Laravel 5.5 及以上版本
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider"

# Laravel 5.4 及以下版本
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="migrations"

执行完以上命令后,还需要运行迁移:

php artisan migrate
设置模型

假设有一个 Post 模型,需要记录其更新操作的日志。首先,在 Post 模型中使用 LogsActivity trait:

use Spatie\Activitylog\Traits\LogsActivity;

class Post extends Model
{
    use LogsActivity;

    // ...
}

然后,在该模型中添加一个 $fillable 属性,用于指定可被记录的属性:

protected $fillable = [
    'title',
    'body',
];
记录日志

在更新 Post 模型时,使用 logChanges() 方法记录更改的属性和旧属性。比如:

$post = Post::find(1);

$post->title = 'New Title';
$post->body = 'New Body';

$post->logChanges();
显示日志

最后,在需要显示日志的地方使用 changes() 方法。比如,在视图中可以这样使用:

<ul>
@foreach ($post->activity as $activity)
    <li>{{ $activity->created_at }}: {{ $activity->description }} {{ $activity->changes() }}</li>
@endforeach
</ul>

注意,changes() 方法会返回一个 Markdown 格式的字符串,用于标记被更新的属性和旧属性。如果需要在视图中将 Markdown 格式转化为 HTML,可以使用 parsedownmarkdown 等库。

结论

Spatie Laravel Activitylog 是一个非常强大的 Laravel 扩展包,提供了多种方便实用的功能,能够帮助我们轻松地记录模型的操作日志。使用该扩展包记录模型的更改操作时,可以使用 properties()oldProperties() 方法,仅记录被更改的属性和旧属性,从而使日志更加清晰明了。