cviebrock/eloquent-loggable

为Laravel 5中的Eloquent模型轻松更改日志。

dev-master 2017-07-06 14:06 UTC

This package is auto-updated.

Last update: 2024-09-05 18:59:28 UTC


README

跟踪Laravel 5中Eloquent模型变更的简单方法。

Build Status Total Downloads Latest Stable Version Latest Unstable Version Scrutinizer Code Quality SensioLabsInsight License: MIT

安装

首先,您需要通过Composer安装此包

$ composer require cviebrock/eloquent-loggable

然后,更新 config/app.php,添加服务提供者的条目(如果您使用的是具有包自动发现的Laravel 5.5,则可以跳过此步骤)

'providers' => [
    // ...
    Cviebrock\EloquentLoggable\ServiceProvider::class,
];

最后,再次从命令行发布默认配置文件

php artisan vendor:publish --provider="Cviebrock\EloquentLoggable\ServiceProvider"

更新Eloquent模型

您的模型应使用 Cviebrock\EloquentLoggable\Loggable 特性。该特性提供了两个可以在模型中重载的方法

  1. getLoggableAttributes() 应返回一个数组,包含您想要记录的所有模型属性。默认情况下,它返回一个空数组,这意味着包将记录已更改的所有属性。

  2. getUnloggableAttributes() 应返回一个数组,包含您希望排除在日志之外的模型属性,即使它们已更改。默认情况下,时间戳列 created_atupdated_at 被排除,如果您的模型还使用Eloquent的 SoftDeletes 特性,则还包括 deleted_at

在计算要记录的属性时,包从“可记录”属性开始,然后删除任何“不可记录”属性,因此配置这两种方法的组合应提供在选择要记录的内容方面最大的灵活性。如果您想记录时间戳列,则应显式地将它们添加到 getLoggableAttributes() 返回的数组中。

注意:任何通过Eloquent的 hidden 属性定义的隐藏属性在记录时都会被混淆。这可以防止密码和其他敏感信息以明文形式记录在数据库中。请确保将适当的属性添加到此数组中!

use Cviebrock\EloquentLoggable\Loggable;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Loggable;

    // If the password is changed, it will be obfuscated in the logged change
    protected $hidden = [
        'secret_code'
    ];

    // Default value is an empty array, which will log all changed attributes
    public function getLoggableAttributes(): array
    {
        return [];
    }

    // The following attributes won't be logged at all
    public function getUnloggableAttributes(): array
    {
        return [
            'unimportant_field'
        ];
    }
}

用法

当模型被创建、更新、删除或恢复时,将记录变更记录。具体来说,将创建一个新的 Cviebrock\EloquentLoggable\Models\Change 模型,并包含相关数据,包括谁执行了更改。

您可以使用特性设置的 changes() 关系获取特定模型的变更历史记录

$post = Post::find(1);

$changes = $post->changes;

这将是一个包含 Change 模型的集合,其中最新的更改排在前面。每个 Change 都具有以下属性

// The user who made the change:
$change->user;

// The date of the change:
$change->created_at;

// The attribute changed, the previous and new values of that attribute:
$change->attribute;
$change->old_value;
$change->new_value;

您也可以从另一个角度操作:根据给定的 Change 模型找到发生了更改的模型。

$change = Change::find(1);

$model = $change->model;

变更集

当模型的一个更改涉及多个属性时,每个更改的属性都会创建一个新的 Change 记录/模型。但是,您可以通过 set 属性将同一时间对该模型发生的所有更改组合在一起。

(此属性实际上是更改的模型、其ID、发起更改的用户和更改时间的散列)

$change = Change::find(1);

$relatedChanges = Change::inSet($change->set)->get();

其他查询作用域

您还可以使用 Change 模型上的其他查询作用域来搜索更改

$post = Post::find(1);

$changes = Change::forModel($post)
	->ofType(Change::TYPE_UPDATE)
	->groupedBySet()
	->get();  // or paginate, even!

配置

该包将配置文件发布到 config/loggable.php。所需的唯一设置是 userModel,它应返回应用程序的用户模型的完全限定类名。默认值 App\User::class 通常足够。

错误、建议和贡献

感谢所有为该项目做出贡献的人!

请使用Github来报告错误、发表评论或提出建议。

有关如何贡献更改,请参阅CONTRIBUTING.md

版权和许可证

eloquent-loggableColin Viebrock编写,并使用MIT许可证发布。

版权所有 (c) 2017 Colin Viebrock