mpociot/versionable

允许创建Laravel 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11模型的版本控制和恢复

4.4.4 2024-05-07 16:32 UTC

README

Laravel模型版本化变得简单

image image image codecov.io Scrutinizer Code Quality Build Status

跟踪所有模型更改并回滚到以前的版本。

// Restore to the previous change
$content->previousVersion()->revert();

// Get model from a version
$oldModel = Version::find(100)->getModel();

安装

您可以通过composer安装

composer require mpociot/versionable

运行迁移。

php artisan migrate --path=vendor/mpociot/versionable/src/migrations

或者,发布迁移。

php artisan vendor:publish --provider="Mpociot\Versionable\Providers\ServiceProvider" --tag="migrations"

然后自定义并运行它们。

php artisan migrate

用法

让想要设置在版本控制下的模型使用VersionableTrait

class Content extends Model {
	
	use Mpociot\Versionable\VersionableTrait;
	
}

就这样!

每次更新模型时,都会在数据库中存储包含以前属性的新版本。

所有时间戳和可选的软删除时间戳都将被忽略。

向现有数据添加版本

Versionable在更新()时为更新的模型创建一个版本。所以,如果您在已存在的应用上安装此插件,可能需要为当前模型创建一个版本。

    $model->createInitialVersion();

如果没有版本存在,这将创建初始版本。

如果您想为模型的全部实例都这样做

    Model::initializeVersions();

排除属性进行版本化

有时您不希望在模型上的每个属性更改时都创建一个版本。例如,您的User模型可能有一个last_login_at属性。我非常确定您不希望每次该用户登录时都创建一个新的User模型版本。

要排除特定的属性进行版本化,请向您的模型添加一个名为dontVersionFields的新数组属性。

class User extends Model {
	
	use Mpociot\Versionable\VersionableTrait;
	
	/**
	 * @var array
	 */
	protected $dontVersionFields = [ 'last_login_at' ];

}

隐藏字段

有时您可能希望在版本数据中包含隐藏字段。您可能已经在模型中使用visiblehidden属性隐藏了这些字段。

您可以通过将这些字段添加到版本化模型的versionedHiddenFields属性中,将通常隐藏在这些项目中的字段保存到版本数据中。

class User {

    use VersionableTrait;

    // Typically hidden fields
    protected $hidden = ['email', 'password'];

    // Save these hidden fields
    protected $versionedHiddenFields = ['email', 'password'];

}

存储的版本的最大数量

您可以控制每个模型存储的版本的最大数量。默认情况下,将没有限制,所有版本都将被保存。根据您的应用程序,这可能导致版本数量过多,因此您可能希望限制存储的版本数量。

您可以通过在可版本化的模型上设置 $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();

禁用版本控制

在某些情况下,您可能希望完全禁用当前请求中特定模型的版本控制。

您可以通过在版本化模型上使用 disableVersioningenableVersioning 方法来实现这一点。

$user = User::find(1);
$user->disableVersioning();

// This will not create a new version entry.
$user->update([
    'some_attribute' => 'changed value'
]);

使用不同的版本表

有时我们希望将模型版本存储在不同的表中。默认情况下,版本存储在由 Mpociot\Versionable\Version::$table 定义的 'versions' 表中。

要使用不同的表来存储某些模型的版本,我们必须更改表名。为此,创建一个扩展 Mpociot\Versionable\Version 的模型,并将 $table 属性设置为另一个表名。

class MyModelVersion extends Version
{
    $table = 'mymodel_versions';
    // ...
}

在您希望使用此特定版本表的模型中,使用 VersionableTrait 特性,并添加 $versionClass 属性,其值为特定版本模型。

class MyModel extends Eloquent
{
    use VersionableTrait ;
    protected $versionClass = MyModelVersion::class ;
    // ...
}

不要忘记为此版本表创建一个迁移,其结构与默认版本表完全相同。

许可证

Versionable 是在 MIT 许可证条款下免费分发的软件。