stojankukrika / versionable
允许创建 Laravel 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11 模型版本控制和恢复
Requires
- php: ^7.1 || ^7.2 || ^7.3 || ^7.4 || ^8.0 || ^8.1 || ^8.2
- illuminate/support: ~5.3 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^3.7 | 8.5
- phpunit/phpunit: 7.* || ^8.0 || ^8.1 || ^9.0 || ^10.0 || ^11.0
README
感谢 原始项目 提供起点和本项目起点。本项目最初作为分支开始,但由于原始用户没有更新,我们将使其更好。
为 Laravel 提供易于使用的模型版本控制
跟踪所有模型更改并回滚到先前版本。
// Restore to the previous change $content->previousVersion()->revert(); // Get model from a version $oldModel = Version::find(100)->getModel();
安装
要将 Versionable 添加到项目中,只需将以下内容添加到 composer.json 中。
"stojankukrika/versionable": "~1.0"
然后运行 composer install
或 composer update
。
或者如果您更喜欢,可以运行 composer require stojankukrika/versionable
。
使用 vendor:publish
命令发布配置和迁移。
php artisan vendor:publish --provider="StojanKukrika\Versionable\Providers\ServiceProvider"
运行迁移以创建将存储所有版本信息的 "versions" 表。
bash
bash php artisan migrate --path=vendor/mpociot/versionable/src/migrations php artisan migrate
用法
让想要设置在版本控制下的模型使用 VersionableTrait
。
class Content extends Model { use StojanKukrika\Versionable\VersionableTrait; }
就是这样!
每次更新模型时,都会将包含先前属性的新版本存储在数据库中。
所有时间戳以及可选的软删除时间戳将被忽略。
排除属性进行版本控制
有时您不希望在模型上的每个属性更改时创建版本。例如,您的用户模型可能有一个 last_login_at
属性。我非常确信您不希望在用户每次登录时创建新的用户模型版本。
要排除特定属性进行版本控制,请向您的模型添加一个新的数组属性,命名为 dontVersionFields
。
class User extends Model { use StojanKukrika\Versionable\VersionableTrait; /** * @var array */ protected $dontVersionFields = [ 'last_login_at' ]; }
存储的版本最大数量
您可以通过在可版本化模型上设置 $keepOldVersions
属性来控制每个模型存储的版本最大数量。默认情况下,将没有限制,所有版本都将保存。根据您的应用程序,这可能导致版本非常多,因此您可能想要限制存储的版本数量。
您可以通过在可版本化模型上设置 $keepOldVersions
属性来做到这一点
class User { use VersionableTrait; // Keep the last 10 versions. protected $keepOldVersions = 10; }
检索与模型关联的所有版本
要检索所有存储的版本,请使用模型上的 versions
属性。
由于这是一个 MorphMany
关系,该属性也可以像访问任何其他 Laravel 关系一样访问。
$model->versions;
获取两个版本之间的差异
如果您想知道两个版本之间确切发生了什么变化,请使用版本模型的 diff
方法。
diff 方法接受一个版本模型作为参数。这定义了要进行比较的版本。如果没有提供版本,它将使用当前版本。
/** * Create a diff against the current version */ $diff = $page->previousVersion()->diff(); /** * Create a diff against a specific version */ $diff = $page->currentVersion()->diff( $version );
结果将是一个关联数组,其中包含属性名称作为键,以及不同的属性值。
回滚到先前版本
保存版本很酷,但真正的好处是能够回滚到特定版本。
有多种方法可以实现这一点。
回滚到上一个版本
您可以使用以下方法轻松回滚到当前活动版本之前的版本
$content->previousVersion()->revert();
回滚到特定版本 ID
您也可以使用以下方法回滚到模型的特定版本 ID
$revertedModel = Version::find( $version_id )->revert();
禁用版本控制
在某些情况下,您可能希望完全禁用当前请求中特定模型的版本控制。
您可以通过在可版本控制的模型上使用 disableVersioning
和 enableVersioning
方法来实现这一点。
$user = User::find(1); $user->disableVersioning(); // This will not create a new version entry. $user->update([ 'some_attribute' => 'changed value' ]);
使用不同的版本表
有时我们希望将模型版本存储在不同的表中。默认情况下,版本存储在由 StojanKukrika\Versionable\Version::$table 定义的 'versions' 表中。
要为某些模型使用不同的表来存储版本,我们需要更改表名。为此,创建一个扩展 StojanKukrika\Versionable\Version 的模型,并将 $table 属性设置为另一个表名。
class MyModelVersion extends Version { $table = 'mymodel_versions'; ... }
在您想要使用这个特定版本表的模型中,使用 VersionableTrait
特性,并添加属性 $versionClass
,其值为特定的版本模型。
class MyModel extends Eloquent { use VersionableTrait ; protected $versionClass = MyModelVersion::class ; ... }
并且不要忘记为这个版本表创建一个迁移,就像默认版本表一样。
许可证
Versionable 是免费软件,根据 MIT 许可证 条款分发。