Laravel 模型事件的應用

在平常處理一些用戶操做事件時,咱們有時候須要記錄下來,方便之後查閱,或者大數據統計。php


Laravel 在模型事件中處理起來很方便:https://laravel-china.org/docs/laravel/5.5/eloquent#eventslaravel


Laravel 的模型事件有兩種方式,數組

  • 設置dispatchesEvents屬性映射事件類app

  • 使用觀察器來註冊事件,這裏介紹第二種ide

  • 新建模型 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是由於在命令行執行時不存在用戶執行)
  • 新建一個觀察器繼承基類LogBaseServerUser模型,方法的名字要對應文檔中的事件)
  • 到新建的服務提供者ObserverLogServiceProvider中運行
  • 爲須要的模型註冊事件(我這挺多的,以後大概長這樣)
  • 而後咱們觸發一些事件(增刪改,表的數據就有了)

  • 多對多的關聯插入不會出觸發模型(好比attach方法)
  • 這時候就須要本身新建事件類來模擬(這裏拿分配權限給角色粗略說一下)
  1. EventServiceProvider中的listen屬性綁定好事件
  2. 事件PermissionRoleEvent中的注入兩個參數,一個是角色,另外一個是attach或者detach返回的數組
  3. 事件監聽器PermissionRoleEventLog也繼承基類LogBaseServer,這裏就是根據傳入的數組id遍歷,而後建立日誌
  4. 以後應用事件

  • 更優雅的處理登陸註銷事件
  1. EventServiceProvider中的subscribe屬性綁定好處理的類
  2. 事件監聽類的方法
  3. 以後的效果就是這樣了:

END

原文地址大數據

相關文章
相關標籤/搜索