zbiller / laravel-revisions
Requires
- php: ^7.2.5
- illuminate/contracts: ^7.0
- illuminate/database: ^7.0
- illuminate/support: ^7.0
Requires (Dev)
- orchestra/testbench: ^5.0
- phpunit/phpunit: ^8.5
README
遗憾的是,此包现已停用。
请查看 Varbox(Laravel 管理面板)以获取此功能及其他更多功能。
- 购买:https://varbox.io/buy
- 文档:https://varbox.io/docs
- 演示:https://demo.varbox.test/admin
- 仓库 https://github.com/VarboxInternational/varbox
谢谢!
为任何 Eloquent 模型及其关系创建版本
概述
此包允许您为任何 Eloquent 模型记录及其底层关系创建版本。
- 创建版本时,它会被存储在
revisions数据库表中。 - 在模型更新时,将自动使用
updatedEloquent 事件创建版本 - 也可以通过使用
saveAsRevision()手动创建版本 - 当记录被强制删除时,所有版本也将自动删除,使用
deletedEloquent 事件
如前所述,此包能够对整个关系及其模型记录进行版本控制。
酷的是,它还能从头开始重新创建关系记录,如果它们在模型记录的生命周期中被强制删除。
可以版本控制的关系类型:hasOne、morphOne、hasMany、morphMany、belongsToMany、morphToMany
安装
通过 Composer 安装此包(适用于 Laravel 6.0 及以上)
composer require neurony/laravel-revisions
通过 Composer 安装此包(适用于 Laravel 5.8)
composer require neurony/laravel-revisions:3.1.0
通过 Composer 安装此包(适用于 Laravel 5.7 及以下)
composer require neurony/laravel-revisions:2.0.0
使用以下命令发布配置文件:
php artisan vendor:publish --provider="Neurony\Revisions\ServiceProvider" --tag="config"
使用以下命令发布迁移文件:
php artisan vendor:publish --provider="Neurony\Revisions\ServiceProvider" --tag="migrations"
迁移发布后,您可以通过运行以下命令创建 revisions 表:
php artisan migrate
设置
步骤 1
您的 Eloquent 模型应使用 Neurony\Revisions\Traits\HasRevisions 特性和 Neurony\Revisions\Options\RevisionOptions 类。
该特性包含一个抽象方法 getRevisionOptions(),您必须自己实现。
以下是如何实现该特性的示例
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Neurony\Revisions\Options\RevisionOptions; use Neurony\Revisions\Traits\HasRevisions; class YourModel extends Model { use HasRevisions; /** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance(); } }
步骤 2
在 revisions.php 配置文件中,为 user_model 配置键写入您的 User 模型类的完整命名空间。
默认情况下,此值为 Laravel 的 User 模型类的全限定名称(\App\User)。如果您没有用户的概念,也可以将其留为 NULL。
这部分由 Neurony\Revisions\Traits\HasRevisions 特性用来知道是谁创建了哪些版本。
使用方法
获取修订版
您可以通过使用存在于 Neurony\Revisions\Traits\HasRevisions 特性中的 revisions() 多对多关系来获取模型记录的修订版。
$model = YourModel::find($id); $revisions = $model->revisions;
创建修订版(自动创建)
一旦您在 Eloquent 模型中使用了 Neurony\Revisions\Traits\HasRevisions 特性,每次更新模型记录时,都会自动创建一个包含其原始属性值的修订版,这是通过使用 updated Eloquent 事件来实现的。
// model is state 1 $model = YourModel::find($id); // model is state 2 // a revision containing the model's state 1 is created $model->update(...);
或者,您也可以通过使用 created Eloquent 事件,在每次 create 新的模型记录时存储一个修订版。
(请参阅 自定义)
创建修订版(手动创建)
如果您需要,也可以通过使用 Neurony\Revisions\Traits\HasRevisions 特性中的 saveAsRevision() 方法手动创建修订版。
$model = YourModel::find($id); // a new entry is stored inside the 'revisions' database table // reflecting the current state of that model record $model->saveAsRevision();
回滚到以前的修订版
您可以使用 rollbackToRevision() 方法将模型记录回滚到其过去的任何一个修订版。
// model is state 1 $model = YourModel::find($id); $revision = $model->revisions()->latest()->first(); // model is now in state 0 $model->rollbackToRevision($revision);
自定义
在创建时启用修订版
默认情况下,在创建新的模型记录时,不会创建修订版,因为记录是新的,处于其第一个状态。但是,如果您希望在创建模型记录时创建修订版,可以通过在 getRevisionOptions() 方法定义中使用 enableRevisionOnCreate() 方法来实现。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->enableRevisionOnCreate(); }
限制修订版数量
您可以通过在 getRevisionOptions() 方法定义中使用 limitRevisionsTo() 方法来限制每个模型记录可以拥有的修订版数量。
这可以防止对于大量更新的记录产生成千上万的修订版。
当达到限制时,在创建新的(最新)修订版之后,脚本将自动删除该模型记录的最旧修订版。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->limitRevisionsTo(100); }
仅修订某些字段
如果您不想修订模型的所有字段(属性),可以在创建新修订版时手动指定要存储的字段,通过在 getRevisionOptions() 方法定义中使用 fieldsToRevision() 方法来实现。
请注意,省略的字段在创建修订版时不会存储,但在回滚到修订版时,那些被忽略的字段将变为 null 或空。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->fieldsToRevision('title', 'content'); }
排除某些字段不被修订
与 fieldsToRevision() 方法相反,如果您在修订 Eloquent 模型时想排除某些字段,请在 getRevisionOptions() 方法定义中使用 fieldsToNotRevision() 方法。
请注意,fieldsToRevision() 方法优先于 fieldsToNotRevision() 方法。
不要在 getRevisionOptions 方法的同一定义中使用这两种方法。
请注意,省略的字段在创建修订版时不会存储,但在回滚到修订版时,那些被忽略的字段将变为 null 或空。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->fieldsToNotRevision('title', 'content'); }
在创建修订版时包含时间戳
默认情况下,创建修订版本时,实际模型的时标将自动从实际修订数据中排除。
如果您希望在创建修订版本时存储模型的时标,请在使用 getRevisionOptions() 方法定义时使用 withTimestamps() 方法。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->withTimestamps(); }
与模型记录一起的修订关系
通常情况下,您会希望创建模型记录的时间副本,这包括修订其关系(尤其是子关系)。
您可以通过在 getRevisionOptions() 方法定义中使用 relationsToRevision() 方法来指定与模型记录一起修订的关系。
请注意,当将模型记录回滚到过去某个修订版本时,指定的关系也将回滚到该修订版本时的状态(这包括在回滚过程中强制删除的关系记录的重新创建,或删除直到修订检查点之前添加的任何相关记录)。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->relationsToRevision('comments', 'author'); }
回滚时禁用创建修订版本
默认情况下,回滚到过去某个修订版本时,会自动创建一个新的修订版本。这个新修订版本包含回滚发生前的模型记录状态。
您可以通过在 getRevisionOptions() 方法定义中使用 disableRevisioningWhenRollingBack() 方法来禁用此行为。
/** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance() ->disableRevisioningWhenRollingBack(); }
事件
修订功能包含两个 Eloquent 事件:revisioning 和 revisioned
您可以像实现 Laravel 框架中包含的任何其他 Eloquent 事件一样实现这些事件。
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Neurony\Revisions\Options\RevisionOptions; use Neurony\Revisions\Traits\HasRevisions; class YourModel extends Model { use HasRevisions; /** * Boot the model. * * @return RevisionOptions */ public static function boot() { parent::boot(); static::revisioning(function ($model) { // your logic here }); static::revisioned(function ($model) { // your logic here }); } /** * Get the options for revisioning the model. * * @return RevisionOptions */ public function getRevisionOptions(): RevisionOptions { return RevisionOptions::instance(); } }
鸣谢
安全
如果您发现任何与安全相关的问题,请通过电子邮件 andrei.badea@neurony.ro 而不是使用问题跟踪器来报告。
许可
MIT 许可证(MIT)。请参阅 LICENSE 以获取更多信息。
变更日志
请参阅 CHANGELOG 以获取有关最近更改的更多信息。
贡献
请参阅 CONTRIBUTING 以获取详细信息。