在日常處理一些用戶操作事件時,我們有時候需要記錄下來,方便以后查閱,或者大數據統計。
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.之后的效果就是這樣了:
相關推薦:最新的五個Laravel視頻教程
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END