laravel 模型事件幾種用法


一 、簡單粗魯(用於本地測試)

路由中定義:php

Event::listen('eloquent.updated: App\Post',function (){
   dump('測試一下修改事件');
});
Route::post('/post/{id}', 'PostController@update');

二 、生成事件和監聽器

在 EventServiceProvider 定義對應關係數據庫

protected $listen = [
        'App\Events\PostEvent' => [
                'App\Listeners\PostListener',
            ],
    ];
php artisan event:generate  //生成文件

event 中注入要操做的類
listen 中handle 方法注入對應事件類框架

public function handle(PostEvent $event)
    {
        dump('測試一下修改事件');
    }

最後在 post 模型中添加 'events' 屬性ide

protected $events = [
         'updated' => PostListener::class
    ];

三 、利用框架的 boot 方法

直接在相關 Model 中定義post

public static function boot() {
        parent::boot();
        
        static::updated(function($model) {
            dump('測試一下修改事件');
        });
    }

四 、定義Trait

若是想對多個模型的updated 或 created 事件進行一些操做,該不會每一個模型都單獨寫一個吧.例如: 日誌 .測試

trait LogRecord
{
    //注意,必須以 boot 開頭
    public static function bootLogRecord()
    {
        foreach(static::getModelEvents() as $event) {
            static::$event(function ($model){
                $model->setRemind();
            });
        }
    }


    public static function getModelEvents()
    {
        if(isset(static::$recordEvents)){
            return static::$recordEvents;
        }
        return ['updated'];
    }

    public function setRemind()
    {
       dump('記錄邏輯操做');
    }
}

而後,在模型中use trait 就能夠了.rest

• creating - 對象已經 ready 但未寫入數據庫
• created - 對象已經寫入數據庫
• updating - 對象已經修改但未寫入數據庫
• updated - 修改已經寫入數據庫
• saving - 對象建立或者已更新但未寫入數據庫
• saved - 對象建立或者更新已經寫入數據庫
• deleting - 刪除前
• deleted - 刪除後
• restoring - 恢復軟刪除前
• restored - 恢復軟刪除後
相關文章
相關標籤/搜索