calamandrei-lorenzo/laravel-versionable

使Laravel模型支持版本控制。

2.0.0 2020-07-09 08:03 UTC

This package is auto-updated.

Last update: 2024-09-24 17:47:40 UTC


README

overtrue/laravel-versionable分叉而来

⏱️ 使Laravel模型支持版本控制。

Build Status Latest Stable Version Latest Unstable Version Scrutinizer Code Quality Code Coverage Total Downloads License

这是一种简化的方法,使模型支持版本历史记录,并且可以轻松回滚到指定版本。

要求

  1. PHP >= 7.4
  2. 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 - 版本内容将包含所有版本化属性值。

贡献

您可以通过以下三种方式之一进行贡献

  1. 使用问题跟踪器提交错误报告。
  2. 问题跟踪器上回答问题或修复错误。
  3. 贡献新功能或更新wiki。

代码贡献过程并不正式。您只需确保遵循PSR-0、PSR-1和PSR-2编码指南。任何新的代码贡献都必须附带相应的单元测试(如果适用)。

许可证

MIT