axn / laravel-eloquent-authorable
支持 Eloquent 模型中的 created_by 和 updated_by 字段。
Requires
- php: ^8.0
- illuminate/support: ^8.0 || ^9.0 || ^10.0
README
由于 Laravel Eloquent 能够自动填充 created_at
和 updated_at
字段,此包为 Eloquent 模型中 created_by
和 updated_by
字段提供自动支持。
此包将避免您在创建和/或更新模型时总是指示执行此操作的用户是谁。它为您完成这项工作,并简化了此类信息的恢复。
因此,您可以轻松存储和显示此类信息
由 AXN 于 2016-03-24 添加,并由 forxer 于 2020-10-01 更新
安装
使用 Composer
composer require axn/laravel-eloquent-authorable
用法
要将功能添加到模型,必须满足以下条件
- 相关的表具有关心的字段(默认为
created_at
和updated_at
) - 模型使用 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_by
和 updated_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::class
和 web
守卫。
您可以这样指定不同的选项
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
和 updated_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, ]; //... }