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)

  1. PlaceOrderHandler xử lý use case, gọi $order->confirm().
  2. Domain phát sự kiện OrderPlaced.
  3. Laravel EventServiceProvider đã đăng ký listener SendConfirmationOnOrderPlaced lắng nghe nó.
  4. 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