lephleg / revisionable
一个启用IP跟踪的venturecraft/revisionable分支。
Requires
- php: >=5.3.0
- illuminate/support: ~4.0|~5.0|~5.1
- dev-master
- 1.28.9
- 1.28.8
- 1.28.7
- 1.28.6
- 1.28.5
- 1.28.4
- 1.28.3
- 1.28.2
- 1.28.1
- 1.28.0
- 1.27.0
- 1.26.0
- 1.25.0
- 1.24.0
- 1.23.0
- 1.22.2
- 1.22.1
- 1.22.0
- 1.21.0
- 1.20.0
- 1.19.0
- 1.18.0
- 1.17.0
- 1.16.0
- 1.15.1
- 1.15.0
- 1.14.0
- 1.13.0
- 1.12.1
- 1.12.0
- 1.11.0
- 1.10.0
- 1.9.0
- 1.8.0
- 1.7.0
- 1.6.0
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3
- 1.2.3
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.0
- dev-wrm
- dev-develop
This package is not auto-updated.
Last update: 2024-09-19 18:24:08 UTC
README
在你的项目中为任何模型拥有修订历史记录,而不需要为此做任何工作,这不是很好吗?通过简单地从你的模型扩展revisionable,你就可以立即拥有这样的功能,并能够显示类似这样的历史记录
- Chris将标题从'Something'改为'Something else'
- Chris将分类从'News'改为'Breaking news'
- Matt将分类从'Breaking news'改为'News'
所以,你不仅可以看到发生的历史,还可以看到谁做了什么,这样就有责任了。
Revisionable是一个Laravel包,它允许你无需思考即可为你的模型保留修订历史。有关背景信息和信息,请参阅这篇文章
与第三方Auth / Eloquent扩展一起工作
Revisionable支持由Cartalyst提供的Auth
Revisionable现在也可以作为一个特性使用,因此你的模型可以继续扩展Eloquent,或者任何扩展Eloquent的类(如Ardent)。
安装
Revisionable可以通过composer安装,详情请见packagist,这里。
将以下内容添加到你的项目的composer.json文件的require
部分
"venturecraft/revisionable": "1.*",
运行composer update以下载包
php composer.phar update
最后,你还需要运行包的迁移(Laravel 5.x)
php artisan migrate --path=vendor/venturecraft/revisionable/src/migrations
对于Laravel 4.x用户
php artisan migrate --package=venturecraft/revisionable
如果你要频繁地进行完全的迁移上下文(使用
migrate:refresh
),你可以做的另一件事是将迁移文件从包复制到你的app/database
文件夹,并将类名从CreateRevisionsTable
更改为类似CreateRevisionTable
的东西(不带's',否则你会得到一个错误,说有重复的类)
cp vendor/venturecraft/revisionable/src/migrations/2013_04_09_062329_create_revisions_table.php app/database/migrations/
文档
实现
新的基于特性的实现
对于任何你想要保留修订历史记录的模型,请在你的模型中包含revisionable命名空间并使用RevisionableTrait
,例如,如果你正在使用另一个可启动的特性,请确保在你的模型中重写boot方法;
namespace MyApp\Models; class Article extends Eloquent { use \Venturecraft\Revisionable\RevisionableTrait; public static function boot() { parent::boot(); } }
作为一个特性,revisionable现在可以与标准的Eloquent模型一起使用,或者与任何扩展Eloquent的类一起使用,例如Ardent。
特性需要PHP >= 5.4
基于旧类实现
新的基于特性的方法与Revisionable的现有安装向后兼容。你仍然可以使用下面的安装说明,它实际上是一个特性的包装器。
对于任何你想要保留修订历史记录的模型,请在你的模型中包含revisionable命名空间并扩展revisionable而不是eloquent,例如
use Venturecraft\Revisionable\Revisionable; namespace MyApp\Models; class Article extends Revisionable { }
请注意,这也适用于命名空间模型。
实现说明
如果需要,您可以通过在模型中将 $revisionEnabled
设置为 false 来禁用版本控制。如果您想暂时禁用版本控制,或者您想创建一个扩展可修订的基础模型,该模型的所有模型都扩展了,但您想关闭某些模型的版本控制,这会很有用。
namespace MyApp\Models; class Article extends Eloquent { use Venturecraft\Revisionable\RevisionableTrait; protected $revisionEnabled = false; }
您还可以在完成 X 次修订后禁用修订,通过将 $historyLimit
设置为您在停止修订之前希望保留的修订次数。
namespace MyApp\Models; class Article extends Eloquent { use Venturecraft\Revisionable\RevisionableTrait; protected $revisionEnabled = true; protected $historyLimit = 500; //Stop tracking revisions after 500 changes have been made. }
为了维持历史记录的限制,但如果您想删除旧修订而不是停止跟踪修订,您可以通过设置 $revisionCleanup
来实现这一功能。
namespace MyApp\Models; class Article extends Eloquent { use Venturecraft\Revisionable\RevisionableTrait; protected $revisionEnabled = true; protected $revisionCleanup = true; //Remove old revisions (works only when used with $historyLimit) protected $historyLimit = 500; //Maintain a maximum of 500 changes at any point of time, while cleaning up old revisions. }
存储软删除
默认情况下,如果您的模型支持软删除,修订版将存储此删除和任何恢复作为模型的更新。
您可以选择忽略删除和恢复,通过将 deleted_at
添加到您的 $dontKeepRevisionOf
数组中。
为了更好地格式化 deleted_at
条目的输出,您可以使用 isEmpty
格式化器(请参阅 格式输出 以了解此示例。)
存储创建
默认情况下,新模型的创建不会作为修订存储。只有模型的后续更改才会存储。
如果您想将创建存储为修订,可以通过将以下内容添加到您的模型中来覆盖此行为,将 revisionCreationsEnabled
设置为 true
protected $revisionCreationsEnabled = true;
更多控制
无疑,会有一些情况,您不希望只为模型的部分字段存储修订历史,这以两种不同的方式得到支持。在您的模型中,您可以选择性地指定您要显式跟踪的字段,其他所有字段将被忽略
protected $keepRevisionOf = array( 'title' );
或者,您可以指定您显式不希望跟踪的字段。所有其他字段将被跟踪。
protected $dontKeepRevisionOf = array( 'category_id' );
$keepRevisionOf
设置优先于$dontKeepRevisionOf
事件
每次创建模型修订时,都会触发一个事件。您可以监听 revisionable.created
,
revisionable.saved
或 revisionable.deleted
。
// app/Providers/EventServiceProviders.php public function boot(DispatcherContract $events) { parent::boot($events); $events->listen('revisionable.*', function($model, $revisions) { // Do something with the revisions or the changed model. dd($model, $revisions); }); }
格式输出
您可以使用
eloquent accessors
在模型中设置值的输出(有关访问器的更多信息,请参阅 Laravel 文档)。因此,以下文档已过时。
在您想控制值输出格式的场景中,例如布尔字段,您可以在模型中的 $revisionFormattedFields
数组中设置它们。例如:
protected $revisionFormattedFields = array( 'title' => 'string:<strong>%s</strong>', 'public' => 'boolean:No|Yes', 'modified' => 'datetime:m/d/Y g:i A', 'deleted_at' => 'isEmpty:Active|Deleted' );
您还可以使用模型中的 $revisionFormattedFieldNames
数组覆盖字段名称输出,例如:
protected $revisionFormattedFieldNames = array( 'title' => 'Title', 'small_name' => 'Nickname', 'deleted_at' => 'Deleted At' );
这在输出修订字段名称时使用 $revision->fieldName()
的情况下生效。
字符串
要格式化字符串,只需在值前加上 string:
并确保包含 %s
(这是实际值将在格式化响应中出现的位置),例如:
string:<strong>%s</strong>
布尔
布尔值默认会显示为 0 或 1,这相当无聊,对最终用户也没有太多意义,因此可以使用此格式化器输出更友好的内容。在值前加上 boolean:
然后添加您的 false 和 true 选项,用竖线分隔,例如:
boolean:No|Yes
日期时间
日期时间默认会显示为 Y-m-d H:i:s。在值前加上 datetime:
然后添加您的日期时间格式,例如:
datetime:m/d/Y g:i A
是否为空
这基于布尔值,但不是检查真或假值,而是检查值是否为 null 或空字符串。
isEmpty:No|Yes
这也可以接受 %s
,如果您想输出值,以下内容将显示 '无' 如果值为空,或者存在实际值
isEmpty:Nothing|%s
加载修订历史记录
要加载给定模型的修订历史,只需在该模型上调用 revisionHistory
方法,例如:
$article = Article::find($id); $history = $article->revisionHistory;
显示历史
大部分情况下,修订历史将包含足够的信息以直接输出更改历史,但是在外键更新的情况下,我们需要能够进行映射,并显示比 plan_id 从 3 变更到 1
更友好的内容。
为了帮助您,有一些辅助方法可以显示更深入的信息,因此您可以显示类似 Chris 将计划从青铜变为黄金
的内容。
上述结果将来自这里
@foreach($account->revisionHistory as $history ) <li>{{ $history->userResponsible()->first_name }} changed {{ $history->fieldName() }} from {{ $history->oldValue() }} to {{ $history->newValue() }}</li> @endforeach
如果您还启用了创建修订版本,您可以这样显示
@foreach($resource->revisionHistory as $history) @if($history->key == 'created_at' && !$history->old_value) <li>{{ $history->userResponsible()->first_name }} created this resource at {{ $history->newValue() }}</li> @else <li>{{ $history->userResponsible()->first_name }} changed {{ $history->fieldName() }} from {{ $history->oldValue() }} to {{ $history->newValue() }}</li> @endif @endforeach
userResponsible()
返回负责修订的用户。返回用户模型,如果没有用户记录则返回 null。
加载的用户模型取决于您在 config/auth.php
文件中为 model
变量设置的配置。
fieldName()
返回已更新的字段的名称,如果更新的字段是外键(在当前阶段,它只查看字段是否有 _id
后缀),则返回 _id
之前的内容。例如,如果字段是 plan_id
,则返回 plan
。
记住,您可以通过模型中的
$revisionFormattedFieldNames
数组覆盖字段的输出。
identifiableName()
当值(旧值或新值)是外键关系的 ID 时使用。
默认情况下,它仅返回已更新的模型的 ID。您可以根据自己的模型覆盖此方法以返回有意义的值。例如:
use Venturecraft\Revisionable\Revisionable; class Article extends Revisionable { public function identifiableName() { return $this->title; } }
oldValue() 和 newValue()
获取更新前或更新后的模型值。如果是外键,则调用 identifiableName()。
未知或无效的外键作为修订
在旧值或新值为不再存在的外键或实际上是 null 的情况下,您可以在模型中设置两个变量来控制这些情况下的输出。
protected $revisionNullString = 'nothing'; protected $revisionUnknownString = 'unknown';
disableRevisionField()
有时暂时禁用一个可修订字段可能会很有用,如果您想保存更新但不需要记录更改。
$object->disableRevisionField('title'); // Disables title
或者
$object->disableRevisionField(array('title', 'content')); // Disables title and content
贡献
鼓励并欢迎贡献;为了保持组织,所有错误和请求都应在主项目的 GitHub 问题选项卡中打开,在 venturecraft/revisionable/issues
所有拉取请求都应提交到 develop 分支,以便在合并到 master 分支之前进行测试。
遇到麻烦了吗?
如果您在使用此包时遇到问题,很可能其他人已经遇到过相同的问题。您可以在以下两个地方查找常见问题的答案:
如果您更喜欢在 StackOverflow 上公开提问,请使用 'revisionable' 标签。