Theo Fowler (PoEAA), Repository là lớp trung gian giữa domain và tầng truy vấn dữ liệu, cung cấp API kiểu collection (find, save, findByEmail) và giấu chi tiết Eloquent/SQL bên dưới.
Business logic chỉ nói chuyện với repository, không viết query trực tiếp.
php
interface UserRepository {
public function findByEmail(string $email): ?User;
}
class EloquentUserRepository implements UserRepository {
public function findByEmail(string $email): ?User {
return User::where('email', $email)->first();
}
}
// bind interface -> implementation trong service container- Lợi: tách logic khỏi ORM, dễ đổi nguồn dữ liệu, dễ mock interface khi test.
- YAGNI: Eloquent model đã là active-record sẵn; phủ một lớp repository lên nó thường là abstraction thừa trừ khi bạn thực sự cần đổi nguồn hoặc test không đụng DB. Đừng thêm chỉ vì "cho đúng pattern".