在日常處理一些使用者操作事件時,我們有時候需要記錄下來,方便以後查閱,或者大資料統計。
Laravel 在模型事件中處理起來很方便:laravel-china.org/docs/larave…
Laravel 的模型事件有兩種方式,
-
設定
dispatchesEvents
屬性對映事件類 -
使用觀察器來註冊事件,這裡介紹第二種
-
新建模型
php artisan make:model Log
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Log extends Model
{
protected $fillable = ['user_name', 'user_id', 'url', 'event', 'method', 'table', 'description'];
}
複製程式碼
- 建立遷移表:
php artisan make:migration create_logs_table
- 表的結構大概是這樣,可按需設計
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
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
方法) - 這時候就需要自己新建事件類來模擬(這裡拿分配許可權給角色粗略說一下)
- 在
EventServiceProvider
中的listen
屬性繫結好事件 - 事件
PermissionRoleEvent
中的注入兩個引數,一個是角色,另一個是attach
或者detach
返回的陣列 - 事件監聽器
PermissionRoleEventLog
也繼承基類LogBaseServer
,這裡就是根據傳入的陣列id遍歷,然後建立日誌 - 之後應用事件
- 更優雅的處理登入登出事件
- 在
EventServiceProvider
中的subscribe
屬性繫結好處理的類 - 事件監聽類的方法
- 之後的效果就是這樣了: