詳解Laravel模型事件的兩種方式

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


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數組注冊(大概如圖中)

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

  • 在app目錄下新建文件夾Observers存放模型觀察器,并新建基類LogBaseServer并在構造函數構建基本屬性(CLI是因為在命令行執行時不存在用戶執行)

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

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

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

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

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

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

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

  • 然后我們觸發一些事件(增刪改,表的數據就有了)

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式


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

1.在EventServiceProvider中的listen屬性綁定好事件

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

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

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

3.事件監聽器PermissionRoleEventLog也繼承基類LogBaseServer,這里就是根據傳入的數組id遍歷,然后創建日志

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

4.之后應用事件

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式


  • 更優雅的處理登錄注銷事件

1.在EventServiceProvider中的subscribe屬性綁定好處理的類

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

2.事件監聽類的方法

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

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

詳解Laravel模型事件的兩種方式詳解Laravel模型事件的兩種方式

相關推薦:最新的五個Laravel視頻教程

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享