makidizajnerica/laravel-snapshoter

v3.0 2022-09-16 08:10 UTC

This package is auto-updated.

Last update: 2024-09-10 01:49:23 UTC


README

Laravel 模型快照器。为模型创建快照,将模型状态回滚到之前的快照。

安装

composer require makidizajnerica/laravel-snapshoter

之后,请务必运行迁移以生成 snapshots

php artisan migrate

然后使用以下命令发布配置文件 snapshoter.php

php artisan vendor:publish --tag=snapshoter-config

用法

您的模型需要实现 MakiDizajnerica\Snapshoter\Contracts\Snapshotable 接口,并使用 MakiDizajnerica\Snapshoter\HasSnapshots 特性。接下来,定义 snapshotFields 方法,该方法将返回您想要保存到快照中的模型属性

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use MakiDizajnerica\Snapshoter\HasSnapshots;
use MakiDizajnerica\Snapshoter\Contracts\Snapshotable as SnapshotableContract;

class Project extends Model implements SnapshotableContract
{
    use HasSnapshots;

    /**
     * Get attributes for the snapshot.
     *
     * @return array<string, mixed>
     */
    public function snapshotAttributes(): array
    {
        return $this->only([
            'name',
            'description',
            'start_at',
            'end_at',
        ]);
    }

    // ...
}

您的模型将有一些可用的方法

<?php

use App\Models\Project;
use MakiDizajnerica\Snapshoter\Models\Snapshot;

// Make snapshot for the model
$project = Project::first();
$project->makeSnapshot();
// or
snapshoter($project);

// Revert model's state to previous snapshot
$project->revertToPreviousSnapshot();

// Revert model's state to the snapshot from a few steps back
$project->revertToPreviousSnapshot(3);

// You can also pass Snapshot instance
$snapshot = $project->snapshots()->first();
$project->revertToSnapshot($snapshot);

如果您想在带有快照的情况下 创建更新保存 模型,可以使用以下方法

<?php

use App\Models\Project;

// Create model with initial snapshot
$project = Project::createWithSnapshot([/* ... */]);

// Update model and make snapshot
$project->updateWithSnapshot([/* ... */]);

// Save model and make snapshot
$project->fill([/* ... */])->saveWithSnapshot();

另一种选择是使用观察者,在模型 创建更新 时自动创建快照

<?php

namespace App\Observers;

use App\Models\Project;

class ProjectObserver
{
    /**
     * Handle the Project "created" event.
     *
     * @param  \App\Models\Project $project
     * @return void
     */
    public function created(Project $project)
    {
        $project->makeSnapshot();
    }

    /**
     * Handle the Project "updated" event.
     *
     * @param  \App\Models\Project $project
     * @return void
     */
    public function updated(Project $project)
    {
        $project->makeSnapshot();
    }
}

作者

Nemanja Marijanovic (n.marijanovic@hotmail.com)

许可证

版权所有 © 2021, Nemanja Marijanovic n.marijanovic@hotmail.com

版权所有。

有关完整的版权和许可信息,请参阅随此包一起分发的 LICENSE 文件。