統一監聽所有模型的模型事件

williamQian發表於2020-06-10

對於單個模型的模型事件,我們可以採用observer或者dispatchEvents的形式,如果要求在所有模型儲存後,做一個相同的操作,那我們要不就需要在分散的observer裡寫重複的程式碼,要不就新建很多events,dispatch出去。有沒有一個簡便的方法呢?研究了下原始碼和論壇文章後,目前採用的下面這種方法,有什麼不足或者錯誤,歡迎大家批評指正。

1. 新建一個訂閱者

<?php

namespace App\Listeners;

use Illuminate\Support\Facades\Log;


class ModelEventSubscriber
{

    /**
     * 處理所有模型的saved事件
     */
    public function onSaved($event, $data)
    {
        Log::info($event, $data);
    }

    /**
     * 為訂閱者註冊監聽器
     *
     * @param  \Illuminate\Events\Dispatcher  $events
     */
    public function subscribe($events)
    {
        $events->listen(
            [
                'eloquent.saved: *',
            ],
            'App\Listeners\ModelEventSubscriber@onSaved'
        );
    }
}

2. 在App/Provider/EventServiceProvider.php里加上剛建立的訂閱者

    /**
     * 需要註冊的訂閱者類。
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\ModelEventSubscriber'    
    ];

3.執行測試,檢視日誌發現可以正常執行

監聽所有模型的saved事件

如果要監聽其他事件,在ModelEventSubscriber$subscribe裡直接加就行,比如eloquent.created: *就是匹配所有模型的created事件,eloquent.created: App\Models\*就是匹配App\Models目錄裡面所有模型的created事件。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章