Laravel Observer 觀察者

laravel 提供模型觀察者的功能,讓我們可以監聽模型上的事件,當觸發特定事件時,可以做而外的處理

舉例說明:
假如在新增商家後,要透過google api取得商家資訊,就可以透過Observer方式處理

透過以下指令創建Observer,預設會放在app/Observers/資料夾底下

php artisan make:observer StoreObserver --model=Store

創建完成後檔案如下

<?php

namespace App\Observers;

use App\Models\Store;

class StoreObserver
{
/**
* Handle the Store "created" event.
*
* @param \App\Models\Store $store
* @return void
*/
public function created(Store $store)
{
//
}

/**
* Handle the Store "updated" event.
*
* @param \App\Models\Store $store
* @return void
*/
public function updated(Store $store)
{
//
}

/**
* Handle the Store "deleted" event.
*
* @param \App\Models\Store $store
* @return void
*/
public function deleted(Store $store)
{
//
}

/**
* Handle the Store "forceDeleted" event.
*
* @param \App\Models\Store $store
* @return void
*/
public function forceDeleted(Store $store)
{
//
}
}

觀察者編輯

我們要在商家創建時進行處理,所以在created函式裡進行處理

public function created(Store $store)
{
$store = Store::findOrFail($store->id);
// ... 抓取api資料以及賦予值
$store->save();
}

註冊觀察者

再到App\Providers\EventServiceProvider註冊Model Observers

可以在boot方法中註冊

use App\Models\Store;
use App\Observers\StoreObserver;

/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
Store::observe(StoreObserver::class);
}

也可以在$observers屬性中列出

use App\Models\Store;
use App\Observers\StoreObserver;

/**
* The model observers for your application.
*
* @var array
*/
protected $observers = [
Store::class => [StoreObserver::class],
];

Observers各方法對應事件

方法 對應事件
retrieved 檢索模型後
creating 在創建模型之前
created 創建模型後
updating 在模型更新之前
updated 模型更新後
saving 在保存模型之前
saved 模型保存後
deleting 在刪除模型之前
deleted 刪除模型後
restoring 在恢復軟刪除模型之前
restored 軟刪除模型恢復後

Observers觀察者 與event事件 差別

Observers 基本上是只能在 Eloquent 模型處理預定義事件(創建記錄、更新記錄、刪除等)。

event事件是通用的,不是預定義的,可以在任何地方使用,不僅是在模型中。