#1. Decision Matrix (Bảng quyết định)
| Công cụ | Khi nào dùng? | Cảnh báo |
|---|---|---|
| Action | Xử lý 1 nghiệp vụ duy nhất (__invoke). |
Tránh làm quá nhiều Action cho 1 tính năng. |
| Service | Nhóm các nghiệp vụ liên quan (VD: UserService). |
Dễ thành “God Class” nếu không tách nhỏ. |
| Trait | Chia sẻ code thuần (helper, log, date). | KHÔNG dùng cho nghiệp vụ chính (khó trace). |
| Interface | Cần thay thế Implementation (Polymorphism). | Chỉ dùng khi thực sự có > 1 implementation. |
| Abstract | Có logic chung và muốn ép con phải override. | Gây tight-coupling giữa cha và con. |
#2. Khi nào tạo Config & Helper?
- Config: Dùng cho mọi tham số cần thay đổi giữa
local,staging,prod(đừng bao giờ đểenv()trực tiếp trong code). - Helper: Chỉ dùng cho logic cực đơn giản và toàn cục (VD:
money_format()). Nếu helper có logic phức tạp -> Đưa vào Service.
#3. Câu hỏi nhanh
Q: Tại sao đừng lạm dụng Interface cho mọi class? A: “YAGNI” (You Ain’t Gonna Need It). Tạo Interface cho class chỉ có 1 implementation duy nhất là “Over-engineering” gây khó đọc code.
Q: Scope Model (Local Query Scope) dùng khi nào?
A: Khi bạn thấy code where('status', 'active') xuất hiện quá 2 lần trong project. Đưa nó vào scopeActive(). Đừng viết logic nghiệp vụ (tính toán, send mail) vào Scope.