axn/laravel-eloquent-authorable

支持 Eloquent 模型中的 created_by 和 updated_by 字段。

6.2.0 2023-02-20 15:06 UTC

This package is auto-updated.

Last update: 2024-09-20 18:39:01 UTC


README

由于 Laravel Eloquent 能够自动填充 created_atupdated_at 字段,此包为 Eloquent 模型中 created_byupdated_by 字段提供自动支持。

此包将避免您在创建和/或更新模型时总是指示执行此操作的用户是谁。它为您完成这项工作,并简化了此类信息的恢复。

因此,您可以轻松存储和显示此类信息

AXN2016-03-24 添加,并由 forxer2020-10-01 更新

安装

使用 Composer

composer require axn/laravel-eloquent-authorable

用法

要将功能添加到模型,必须满足以下条件

  1. 相关的表具有关心的字段(默认为 created_atupdated_at
  2. 模型使用 trait Axn\EloquentAuthorable\Authorable

数据库列

您必须在模型相关的表的数据库中创建这些列。这些列用于在相关表和“用户”表之间创建关系。

例如

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedInteger('created_by')->nullable();
    $table->unsignedInteger('updated_by')->nullable();

    $table->foreign('created_by')
        ->references('id')
        ->on('users');

    $table->foreign('updated_by')
        ->references('id')
        ->on('users');
});

迁移助手

提供方便的实用工具,用于在迁移中添加或删除这些列

Schema::create('posts', function (Blueprint $table) {
    //...
    $table->addAuthorableColumns();
});
Schema::table('posts', function (Blueprint $table) {
    //...
    $table->dropAuthorableColumns();
});

默认情况下,addAuthorableColumns() 方法将生成无符号 BigInteger 类型的列,如果您需要无符号 Integer,可以将第一个参数传递为 false

Schema::create('posts', function (Blueprint $table) {
    //...
    $table->addAuthorableColumns(false);
});

如果您需要,也可以传递一个用户模型类名作为第三个参数。

Schema::create('posts', function (Blueprint $table) {
    //...
    $table->addAuthorableColumns(true, App\Models\User::class);
});

警告! 这些实用工具在迁移执行时使用包配置文件中指定的列名。如果您修改此配置,在迁移之前或之后,或者如果您通过模型覆盖配置,则不应使用这些实用工具,而应自己添加列。因此,这些实用工具非常适合新应用,但对于旧应用或现有模型,也建议您自己创建列。

重要提示 您可以通过设置自定义列名和用户表;可以是全局的,也可以是按模型(见下文)

Eloquent 模型

use Axn\EloquentAuthorable\AuthorableTrait;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    use AuthorableTrait;

    //...
}

从现在起,每个在 Posts 表中的条目创建/更新操作,created_byupdated_by 列将自动填充当前认证用户的 id。

此外,还提供了两个 1-n 逆向关系(属于)与用户表

  • createdBy()
  • updatedBy()

使用 Eloquent 预加载

$post = Post::with('createdBy', 'updatedBy')->first();

在 Blade 视图中使用

Created by {{ $post->createdBy->name }} ({{ $post->createdBy->email }})
and updated by {{ $post->updatedBy->name }} ({{ $post->updatedBy->email }})

设置

有两种方式来设置此功能

  • 通过配置文件对您的应用程序全局设置
  • 或为使用它的每个模型设置

全局配置

首先通过运行此命令在您的应用程序中初始化配置文件

php artisan vendor:publish --provider="Axn\EloquentAuthorable\ServiceProvider" --tag="config"

然后,在发布时,config/eloquent-authorable.php 配置文件将包含默认值,您可以对其进行自定义。

此文件中的默认值是

  • users_model: App\User::class
  • guard: web
  • set_author_when_creating: true
  • set_author_when_updating: true
  • created_by_column_name: ‘created_by’
  • updated_by_column_name: ‘updated_by’

按模型设置

模型与守卫

默认情况下,使用用户模型 App\User::classweb 守卫。

您可以这样指定不同的选项

use Axn\EloquentAuthorable\AuthorableTrait;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    use AuthorableTrait;

    public $authorable = [
        'users_model' => \App\Admin::class,
        'guard' => 'admin',
    ];

    //...
}

列名

默认情况下,使用 created_byupdated_by 列。

您可以这样为模型指定不同的列名

use Axn\EloquentAuthorable\AuthorableTrait;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    use AuthorableTrait;

    public $authorable = [
        'created_by_column_name' => 'custom_created_by',
        'updated_by_column_name' => 'custom_updated_by',
    ];

    //...
}

启用/禁用

您可以通过这种方式禁用该功能

use Axn\EloquentAuthorable\AuthorableTrait;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    use AuthorableTrait;

    public $authorable = [
        'set_author_when_creating' => false,
        'set_author_when_updating' => false,
    ];

    //...
}

自定义实现的完整示例

use Axn\EloquentAuthorable\AuthorableTrait;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    use AuthorableTrait;

    public $authorable = [
        'users_model' => \App\Admin::class,
        'guard' => 'admin',
        'created_by_column_name    => 'custom_created_by',
        'set_author_when_creating' => true,
        'updated_by_column_name'   => 'custom_updated_by',
        'set_author_when_updating' => false,
    ];

    //...
}