Laravel 模型事件的應用

DavidNineRoc發表於2019-02-16

在日常處理一些使用者操作事件時,我們有時候需要記錄下來,方便以後查閱,或者大資料統計。


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是因為在命令列執行時不存在使用者執行)

  • 新建一個觀察器繼承基類LogBaseServerUser模型,方法的名字要對應文件中的事件)

  • 到新建的服務提供者ObserverLogServiceProvider中執行

  • 為需要的模型註冊事件(我這挺多的,之後大概長這樣)

  • 然後我們觸發一些事件(增刪改,表的資料就有了)


  • 多對多的關聯插入不會出觸發模型(比如attach方法)
  • 這時候就需要自己新建事件類來模擬(這裡拿分配許可權給角色粗略說一下)

1.在EventServiceProvider中的listen屬性繫結好事件

2.事件PermissionRoleEvent中的注入兩個引數,一個是角色,另一個是attach或者detach返回的陣列

3.事件監聽器PermissionRoleEventLog也繼承基類LogBaseServer,這裡就是根據傳入的陣列id遍歷,然後建立日誌

4.之後應用事件


  • 更優雅的處理登入登出事件

1.在EventServiceProvider中的subscribe屬性繫結好處理的類

2.事件監聽類的方法

3.之後的效果就是這樣了:

END
原文地址

相關文章