Laravel 的模型觀察者 (Observer)
•
•
•
2 分鐘
•
0
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 紀錄。
因為觀察者會讓程式碼有一些隱性的行為,對後續維護上或許會造成一些困擾。