Observer gắn vào vòng đời của một Eloquent model.
Laravel tự gọi các hook creating, created, updating, updated, deleting, deleted, restored mỗi khi model đó được thao tác — không cần dispatch gì cả.
class OrderObserver
{
public function created(Order $order): void { $order->user->notify(new OrderPlaced($order)); }
}
// đăng ký: #[ObservedBy(OrderObserver::class)] trên model, hoặc Order::observe(...) trong boot()Event/Listener là cơ chế tổng quát: bạn tự định nghĩa event, tự dispatch, nhiều listener cùng lắng nghe, listener có thể ShouldQueue để chạy nền, và event có thể broadcast ra WebSocket.
OrderPaid::dispatch($order); // nhiều listener: gửi mail, cộng điểm, ghi logChọn thế nào:
- Logic gắn chặt với thay đổi dữ liệu của model (sinh slug, ghi audit, xoá cache) → Observer.
- Sự kiện nghiệp vụ không trùng khớp thao tác DB (thanh toán thành công, hết hàng), cần nhiều bên phản ứng, hoặc cần chạy nền/broadcast → Event + Listener.
Bẫy quan trọng: observer không chạy với các thao tác đi qua query builder hàng loạt: Order::where(...)->update([...]) hay ->delete() không nạp model nên không bắn hook nào. Muốn chắc chắn thì lặp và save() từng model, hoặc đặt logic ở tầng service thay vì phụ thuộc hook.