Giới thiệu về Domain-Driven Design (DDD) trong Laravel
Model-View-Controller (MVC) rất tuyệt vời cho các ứng dụng nhỏ và vừa. Nhưng khi bạn có 200 Model, 500 Controller, và logic spaghetti ở khắp nơi, MVC bắt đầu sụp đổ.
Domain-Driven Design (DDD) cung cấp một cách để cấu trúc các hệ thống phức tạp bằng cách tập trung vào "Domain" (Nghiệp vụ) thay vì Framework.
Cấu trúc Laravel Chuẩn vs. DDD
Chuẩn:
app/
Http/Controllers/
Models/
Services/
Cách tiếp cận DDD (Modular Monolith):
src/
Domain/
Invoicing/
Actions/
Models/
DataTransferObjects/
Events/
Ordering/
...
App/ (Lớp kết nối với Framework)
Http/Controllers/
Jobs/
Các khái niệm DDD chính trong Laravel
1. Domain
Đây là nơi logic nghiệp vụ của bạn tồn tại. Lý tưởng nhất là nó nên không phụ thuộc vào framework (hoặc liên kết lỏng lẻo).
Ví dụ: Orders, Inventory, Users.
2. Value Objects
Các kiểu nguyên thủy như string và integer khá yếu. DDD sử dụng Value Objects.
Thay vì $email (string), sử dụng EmailAddress (object).
Thay vì $price (float), sử dụng Money (object có currency).
final class Money {
public function __construct(
public readonly int $amount,
public readonly string $currency
) {}
public function add(Money $other): self { ... }
}
3. Data Transfer Objects (DTOs)
Ngừng truyền các mảng kết hợp ($data['key']) khắp nơi. Mảng rất "bí ẩn". DTOs thì chặt chẽ.
class CreateOrderData extends DataTransferObject {
public function __construct(
public int $userId,
public array $items,
public ?string $couponCode
) {}
}
4. Aggregates
Aggregate là một cụm các đối tượng được xử lý như một đơn vị khi thay đổi dữ liệu.
Ví dụ: Một Order (Root) có nhiều OrderLines. Bạn không nên sửa đổi OrderLine trực tiếp; bạn sửa đổi Order và nó sẽ cập nhật các line của nó.
Bắt đầu như thế nào?
Bạn không cần áp dụng DDD đầy đủ ngay lập tức.
- Nhóm theo tính năng, không phải theo loại. Di chuyển
OrderControllervà modelOrdervào moduleOrders. - Sử dụng DTOs thay vì Arrays.
- Tách logic từ Models sang Actions.
Thư viện được khuyến nghị
spatie/laravel-data(Cho DTOs)laravel-modules(Cho cấu trúc thư mục)
DDD phức tạp, nhưng đây là chính sách bảo hiểm tốt nhất chống lại nợ kỹ thuật trong các hệ thống doanh nghiệp.