calamandrei-lorenzo / laravel-versionable
使Laravel模型支持版本控制。
2.0.0
2020-07-09 08:03 UTC
Requires
- php: ^7.4
- laravel/framework: ^5.8|^6.0|^7.0
- sebastian/diff: ^3.0|^4.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- orchestra/testbench: ^5.3
- phpunit/phpunit: ^8.1|^9.0
README
从overtrue/laravel-versionable分叉而来
⏱️ 使Laravel模型支持版本控制。
这是一种简化的方法,使模型支持版本历史记录,并且可以轻松回滚到指定版本。
要求
- PHP >= 7.4
- laravel/framework >= 5.8|6.0|7.0
功能
- 保留指定数量的版本。
- 版本化属性的黑白名单。
- 轻松回滚到指定版本。
- 仅记录已更改的属性。
- 易于自定义。
安装
$ composer require overtrue/laravel-versionable -vvv
可选,可以发布配置文件
$ php artisan vendor:publish --provider="CalamandreiLorenzo\\LaravelVersionable\\ServiceProvider" --tag=config
如果您想自定义版本表迁移,可以将迁移文件发布到您的数据库路径
$ php artisan vendor:publish --provider="CalamandreiLorenzo\\LaravelVersionable\\ServiceProvider" --tag=migrations
然后运行此命令以创建数据库迁移
$ php artisan migrate
用法
将CalamandreiLorenzo\LaravelVersionable\Versionable
特性添加到模型中,并设置版本化属性
use CalamandreiLorenzo\LaravelVersionable\Versionable; class Post extends Model { use Versionable; /** * Versionable attributes * * @var array */ protected $versionable = ['title', 'content']; <...> }
在保存版本化模型时将创建版本。
$post = Post::create(['title' => 'version1', 'content' => 'version1 content']); $post->update(['title' => 'version2']);
获取版本
获取所有版本
$post->versions;
获取最后版本
$post->lastVersion;
回滚
将模型实例回滚到指定版本
$post->getVersion('uuid-...')->revert(); $post->getVersionByVersionNumber('uuid-...')->revert(); // or $post->revertToVersion('uuid-...'); $post->revertToVersionNumber(3);
删除版本
// soft delete $post->removeVersion($versionId = 1); $post->removeVersions($versionIds = [1, 2, 3]); $post->removeAllVersions(); // force delete $post->forceRemoveVersion($versionId = 1); $post->forceRemoveVersions($versionIds = [1, 2, 3]); $post->forceRemoveAllVersions();
通过id恢复已删除的版本
$post->restoreThrashedVersion($id);
暂时禁用版本控制
// create Post::withoutVersion(function () use (&$post) { Post::create(['title' => 'version1', 'content' => 'version1 content']); }); // update Post::withoutVersion(function () use ($post) { $post->update(['title' => 'updated']); });
自定义版本存储策略
您可以通过属性protected $versionStrategy
设置以下不同的版本策略
CalamandreiLorenzo\LaravelVersionable::DIFF
- 版本内容仅包含已更改的属性(默认策略)。CalamandreiLorenzo\LaravelVersionable::SNAPSHOT
- 版本内容将包含所有版本化属性值。
贡献
您可以通过以下三种方式之一进行贡献
代码贡献过程并不正式。您只需确保遵循PSR-0、PSR-1和PSR-2编码指南。任何新的代码贡献都必须附带相应的单元测试(如果适用)。
许可证
MIT