Laravel 的模型觀察者 (Observer)
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.php
的 boot
方法中註冊。
<?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);
}
}
這樣當訂單建立時,就會觸發 OrderObserver
的 created
方法,減少產品的數量。
雖然觀察者可以做到解藕,但我個人會比較建議將觀察者用在無關商業邏輯的地方,例如寫 Log 紀錄。
因為觀察者會讓程式碼有一些隱性的行為,對後續維護上或許會造成一些困擾。