在日常處理一些使用者操作事件時,我們有時候需要記錄下來,方便以後查閱,或者大資料統計。
Laravel 在模型事件中處理起來很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events
Laravel 的模型事件有兩種方式,
- 設定
dispatchesEvents
屬性對映事件類 - 使用觀察器來註冊事件,這裡介紹第二種
- 新建模型
php artisan make:model Log
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Log extends Model
{
protected $fillable = [`user_name`, `user_id`, `url`, `event`, `method`, `table`, `description`];
}
- 建立遷移表:
php artisan make:migration create_logs_table
- 表的結構大概是這樣,可按需設計
<?php
use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;
class CreateLogsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create(`logs`, function (Blueprint $table) {
$table->engine = `InnoDB`;
$table->increments(`id`);
$table->string(`user_id`)->comment(`操作人的ID`);
$table->string(`user_name`)->comment(`操作人的名字,方便直接查閱`);
$table->string(`url`)->comment(`當前操作的URL`);
$table->string(`method`)->comment(`當前操作的請求方法`);
$table->string(`event`)->comment(`當前操作的事件,create,update,delete`);
$table->string(`table`)->comment(`操作的表`);
$table->string(`description`)->default(``);
$table->timestamps();
});
DB::statement("ALTER TABLE `logs` comment `操作日誌表`");
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists(`logs`);
}
}
- 執行遷移生成表
php artisan migrate
- 新建一個服務提供者統一註冊所有的模型事件觀察器(後面的名字可以自己起得形象一點)
php artisan make:provider ObserverLogServiceProvider
- 到
/config/app.php
中的providers
陣列註冊(大概如圖中)
- 在
app
目錄下新建資料夾Observers
存放模型觀察器,並新建基類LogBaseServer
並在建構函式構建基本屬性(CLI是因為在命令列執行時不存在使用者執行)
- 新建一個觀察器繼承基類
LogBaseServer
(User模型,方法的名字要對應文件中的事件)
- 到新建的服務提供者
ObserverLogServiceProvider
中執行
- 為需要的模型註冊事件(我這挺多的,之後大概長這樣)
- 然後我們觸發一些事件(增刪改,表的資料就有了)
- 多對多的關聯插入不會出觸發模型(比如
attach
方法) - 這時候就需要自己新建事件類來模擬(這裡拿分配許可權給角色粗略說一下)
1.在EventServiceProvider
中的listen
屬性繫結好事件
2.事件PermissionRoleEvent
中的注入兩個引數,一個是角色,另一個是attach
或者detach
返回的陣列
3.事件監聽器PermissionRoleEventLog
也繼承基類LogBaseServer
,這裡就是根據傳入的陣列id遍歷,然後建立日誌
4.之後應用事件
- 更優雅的處理登入登出事件
1.在EventServiceProvider
中的subscribe
屬性繫結好處理的類
2.事件監聽類的方法
3.之後的效果就是這樣了:
END
原文地址