Skip to content

activitylog

安装配置

向军大叔每晚八点在 抖音bilibli 直播

xj-small

activitylog 是用于记录全站动态的扩展包。

4.1 及以上需要 php 8

首先安装扩展包

composer require spatie/laravel-activitylog

生成迁移文件

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"

创建数据表

php artisan migrate

生成配置文件

php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-config"

基本使用

创建动态是非常简单的,下面是创建动态的操作示例。你可以将代码写在模型的 Observer 中。

activity()
->causedBy(Auth::user()) //causer_type与causer_id字段
->performedOn($comment) //subject_type与subject_id字段
->withProperties([]) //properties属性
->event('created') //event属性
->log('created'); //description属性

下面对属性进行说明

属性说明
causedBy创建动态的用户
performedOn产生动态的模型
withProperties动态属性
useLog动态事件 如 created,可以修改 activitylog.php 配置文件的 default_log_name 属性定义默认事件
log动态描述

模型定义

除了上面的链式方法使用外,也可以在模型中定义,让动态在模型变化时自动创建。

下面示例在 Comment 模型执行新增事件时,生成动态。并通过 getDescriptionForEvent 方法返回动态的描述。

...
use Spatie\Activitylog\Traits\LogsActivity;

class Comment extends Model
{
    use HasFactory, LogsActivity;

		...

    //动态记录事件
    protected static $recordEvents = ['created'];

    /**
     * 动态描述
     * @param string $eventName
     * @return string
     */
    public function getDescriptionForEvent(string $eventName): string
    {
        return mb_substr(strip_tags($this->html), 0, 50);
    }
    ...
}
...

查询动态

查询动态使用和普通模型的操作是一致的。

基本使用

下例查看所有动态,并通过资源处理后返回到前台。

namespace App\Http\Controllers;

use App\Http\Resources\ActivityResource;
use Illuminate\Http\Request;
use Spatie\Activitylog\Models\Activity;

class ActivityController extends Controller
{
    public function index()
    {
        return ActivityResource::collection(Activity::paginate(10));
    }
}

动态资源类

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class ActivityResource extends JsonResource
{
    public function toArray($request)
    {
        return parent::toArray($request) + [
        		//动态生成的模型
            'subject' => $this->subject,
            //产生动态的用户
            'causer' => $this->causer,
        ];
    }
}

用户动态

下面是查询编号为 5 的用户动态

Activity::where('causer_id', 5)->with(['causer:id,name'])->latest()->paginate(10);