Domain Event
Domain Event là các sự kiện phát sinh trong domain khi trạng thái thay đổi - ví dụ OrderPlaced (đã đặt hàng), OrderCancelled (đã huỷ), ProductOutOfStock (hết hàng). Chúng nằm ở Tầng Domain dưới dạng các class sự kiện.
🔔 Vai trò
- Cho phép tách rời phần “chuyện gì đã xảy ra” khỏi phần “phản ứng lại chuyện đó”.
- Khi entity thực hiện xong một hành vi nghiệp vụ, nó phát ra một event. Các nơi quan tâm lắng nghe (listener/handler) và phản ứng.
- Đây chính là cơ chế Observer Pattern áp dụng ở cấp domain.
🔄 Luồng ví dụ (đặt hàng)
PlaceOrderHandlerxử lý use case, gọi$order->confirm().- Domain phát sự kiện
OrderPlaced. - Laravel
EventServiceProviderđã đăng ký listenerSendConfirmationOnOrderPlacedlắng nghe nó. - Listener chạy → dùng
MailNotificationService(hạ tầng) để gửi email xác nhận.
Nhờ event, muốn thêm phản ứng mới (vd gửi SMS khi
OrderPlaced) chỉ cần viết thêm listener - không đụng vào logic đặt hàng. Đây là biểu hiện của Open Closed Principle.
⚠️ Lưu ý vị trí code
Bản thân class event thuộc domain. Nhưng listener thường được xếp ở Tầng Application (vì điều phối) hoặc Tầng Infrastructure (nếu chỉ là kỹ thuật gửi mail thuần). Việc gửi mail thật sự luôn là hạ tầng - xem Infrastructure Code là gì.
Liên quan
- Domain Model - Mô hình miền nghiệp vụ
- Observer Pattern - cơ chế pub/sub nền tảng
- Open Closed Principle - thêm listener không sửa code cũ
- Hexagonal Architecture - Ports and Adapters - event bus như một loại port