makidizajnerica / laravel-snapshoter
Laravel 模型快照器。
v3.0
2022-09-16 08:10 UTC
Requires
- php: >=8.0
- laravel/framework: >=9.0
Requires (Dev)
- orchestra/testbench: ^6.9
- phpunit/phpunit: ^9.5
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 文件。