eribloo / laravel-model-snapshots
Laravel 模型版本存储包
Requires
- php: ^8.1
- fidum/laravel-eloquent-morph-to-one: ^2.2
- illuminate/contracts: ^9.0|^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- roave/security-advisories: dev-latest
- tightenco/duster: ^1.0
README
⚠️ 免责声明
此包仍在开发中,可能会频繁更改。
简介
此包允许创建模型的快照。
虽然当需要模型版本控制时,添加版本列的典型方法通常足够,但此包在专用表中存储快照。这提供了更好的快照控制,并保持您的表整洁。
创建此包的动机是在需要时仅创建可配置的快照,而不是在每次更新时都生成新的版本,同时保持与最新原始模型的连接。
目录
安装
您可以通过 composer 安装此包
composer require eribloo/laravel-model-snapshots
您可以使用以下命令发布和运行迁移
php artisan vendor:publish --tag="model-snapshots-migrations"
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="model-snapshots-config"
这是已发布配置文件的内容
return [ /** * Snapshot class used. Must implement EriBloo\LaravelModelSnapshots\Contracts\Snapshot interface. */ 'snapshot_class' => EriBloo\LaravelModelSnapshots\Models\Snapshot::class, /** * Versionist class used. Must implement EriBloo\LaravelModelSnapshots\Contracts\Versionist interface. */ 'versionist_class' => EriBloo\LaravelModelSnapshots\Support\Versionists\IncrementingVersionist::class, ];
用法
基础
创建快照
您可以使用辅助函数 snapshot()
创建快照
snapshot(Document::find(1))->commit();
这将使用在 EriBloo\LaravelModelSnapshots\SnapshotOptions
类中定义的默认选项来创建模型的快照
- 使用配置中定义的版本主义者类设置版本
- 快照所有属性,排除主键、时间戳和隐藏属性
- 如果已存在具有相同存储属性的另一个快照,则不会创建快照 - 在这种情况下,将返回匹配的快照
每个快照存储一个包含模型属性、创建时使用的选项、版本和可选描述的数组。
快照提供了 toModel(bool $fillExcludedAttributes = false)
方法,该方法返回填充了快照属性的模型。如果可选的 fillExcludedAttributes
选项为 true,返回的模型将使用当前模型属性作为基础,否则缺失的属性将为 null。
相应地,如果您检索到快照集合,您可以使用其 toModels(bool $fillExcludedAttributes = false)
方法将所有快照映射到相应的类。
回滚、分支和分支快照
快照有 3 个辅助方法来从快照恢复模型或创建新的模型
revert()
- 将原始模型恢复到其快照版本,删除使用后创建的所有快照branch()
- 从快照版本创建新模型,并复制到包含和包括所使用的一个快照的所有快照,将它们关联到新模型fork()
- 从快照版本创建新模型,没有快照历史记录
排除在快照之外将使用当前模型值填充属性。
关系
此外,包提供了一个单独的表来存储与其它模型的快照关系。有 morphToMany 和 morphToOne 关系可用,它们在 HasSnapshotRelations
特质 中返回 Snapshots 或 Models。
配置
快照选项
可以通过在模型上创建 getSnapshotOptions()
方法来定义选项
public function getSnapshotOptions(): SnapshotOptions { return SnapshotOptions::defaults(); }
可配置的选项包括
withVersionist(Versionist $versionist)
- 设置 版本主义者snapshotExcept(array $exclude)
- 排除要存储的属性snapshotHidden(bool $option = true)
- 存储隐藏属性snapshotDuplicate(bool $option = true)
- 强制创建快照,即使已存在相同的快照
大多数方法都可以在快照时通过这些方法进行覆盖
version(Closure $closure)
- 接收当前 Versionist 对象的闭包,这样您可以在需要时访问和调用其方法description(?string)
- 添加可选的简短描述setExcept(array $except)
、appendExcept(array $except)
、removeExcept(array $except)
- 修改排除属性列表withHidden()
、withoutHidden()
- 修改是否应该快照隐藏属性forceDuplicate()
、noDuplicate()
- 即使已存在重复的快照,也要强制创建快照
版本主义者
Versionist 是一个负责确定下一个快照版本的类。默认情况下有 2 个类可用
IncrementingVersionist
- 增量版本SemanticVersionist
- 以major.minor
格式保留版本
如果您想创建自己的版本类,它必须实现 EriBloo\LaravelModelSnapshots\Contracts\Versionist
并具有方法
public function getFirstVersion(): string; public function getNextVersion(string $version): string;
特质
虽然创建快照不需要特性,但此包提供了 2 个辅助特性来检索快照
HasSnapshots
- 提供了snapshots()
关系以检索存储的快照以及一些获取器getLatestSnapshot()
getSnapshotByVersion(string $version)
- 返回指定版本的快照getSnapshotByDate(DateTimeImmutable $date)
- 返回在指定日期之前创建的最后一个快照
HasSnapshotRelations
- 提供创建与快照连接的关系方法morphSnapshots(string $snapshotClass)
- 辅助morphToMany
morphSnapshot(string $snapshotClass)
- 辅助morphToOne
morphSnapshotAsModels(string $snapshotClass)
- 返回具有toModels(false)
应用的快照的morphToMany
morphSnapshotAsModel(string $snapshotClass)
- 返回具有toModel(false)
应用的快照的morphToOne
事件
有一些事件被触发
SnapshotCommitted
- 在提交新快照时触发,但在找到重复时不会触发SnapshotReverted
- 在回滚快照时触发SnapshotBranched
- 在创建新快照分支时触发SnapshotForked
- 在快照被分叉时触发
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件