Laravel 的模型觀察者 (Observer)

程式技術
sharkHead

Laravel 提供一種模型 (Model) 觀察者 (Observer) 的功能,讓你可以在對模型進行新增、修改與刪除時。

觸發特定的事件,並額外做出其他處理,有點類似程式中常會提到的鉤子 (Hooking)

假設你有一個購物網站,你想要在訂單成功新增之後,自動減少產品的數量
這個時候,我們可以對訂單模型使用觀察者的功能。

php artisan make:observer OrderObserver --model=Order

上述指令是新增 Order 模型的觀察者 OrderObserver.php,預設會放在 app/Observers/ 資料夾底下。

Laravel 的 Observer 預設提供以下幾個事件點的方法:

  • creating:資料即將創建的事件。
  • created:資料創建後的事件。
  • updating:資料即將更新的事件。
  • updated:資料更新後的事件。
  • saving:資料即將保存的事件。
  • saved:資料保存後的事件。
  • deleting:資料即將刪除的事件。
  • deleted:資料刪除後的事件。
  • restoring:資料即將從軟刪除狀態回復的事件。
  • restored:資料從軟刪除狀態回復後的事件。

因為是訂單建立後去減少產品的數量,因此應該要使用 created 方法。

<?php

namespace App\Observers;

use App\Models\Order;
use App\Models\Product;

class OrderObserver
{
	public function created(Order $order)
	{
		$product = Product::find($order->id);
		if ($product) {
			$product->decrement('quantity')
		}
	}
}

要啟用此模型觀察者,我們需要在 AppServiceProvider.phpboot 方法中註冊。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Models\Order;
use App\Observers\OrderObserver;

class AppServiceProvider extends ServiceProvider
{
	public function boot()
	{
		Order::observe(OrderObserver::class);
	}
}

這樣當訂單建立時,就會觸發 OrderObservercreated 方法,減少產品的數量。

雖然觀察者可以做到解藕,但我個人會比較建議將觀察者用在無關商業邏輯的地方,例如寫 Log 紀錄。

因為觀察者會讓程式碼有一些隱性的行為,對後續維護上或許會造成一些困擾。

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言