#在日常處理一些使用者操作事件時,我們有時需要記錄下來,方便以後查閱,或大數據統計。
Laravel 在模型事件中處理起來很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#events
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 make:provider ObserverLogServiceProvider
-
到
/config/app.php中的
providers 陣列註冊(大概如圖)
-
#在
app目錄下新資料夾Observers 存放模型觀察器,並新建基底類別
並在建構子建構基本屬性(CLI是因為在命令列執行時不存在使用者執行)
(User模型,方法的名字要對應文件中的事件)
#到新建的服務提供者ObserverLogServiceProvider中運行
#為需要的模型註冊事件(我這挺多的,之後大概長這樣)
多對多的關聯插入不會出觸發模型(例如
attach#方法)這時候就需要自己新建事件類別來模擬(這裡拿分配權限給角色粗略說一下)
1.在
EventServiceProvider
listen屬性綁定好事件
#############2.事件###PermissionRoleEvent###中的注入兩個參數,一個是角色,另一個是###attach###或###detach###傳回的陣列####################3.事件監聽器PermissionRoleEventLog
也繼承基底類別LogBaseServer
,這裡就是根據傳入的陣列id遍歷,然後建立日誌
#4.之後應用事件
- 更優雅的處理登入登出事件
1.在EventServiceProvider
中的subscribe
屬性綁定好處理的類別
#2.事件監聽類別的方法
3.之後的效果就是這樣了: