Pola Repository di Laravel: Kapan Worth It?
Repository pattern di komunitas Laravel itu polarizing. Ada yang bilang "wajib", ada yang bilang "over-engineering". Setelah pakai di 5+ project (mulai dari Karsa Sarimbitan sampai sistem Minerba di Volantis), opini saya: tergantung skala dan tim.
Kapan Repository pattern WORTH IT
1. Tim besar dengan banyak developer junior
Tanpa abstraksi, junior developer cenderung scatter Eloquent query di mana-mana — controller, blade, bahkan middleware. Repository pattern enforce centralization.
2. Multiple data source
Project Minerba pakai PostgreSQL + REST API eksternal. Repository pattern bikin layer atas nggak peduli data dari mana:
interface PermohonanRepository {
public function findById(int $id): ?Permohonan;
public function search(array $filters): Collection;
}
class EloquentPermohonanRepository implements PermohonanRepository { ... }
class ApiPermohonanRepository implements PermohonanRepository { ... }Switch implementation tinggal ubah binding di Service Provider.
3. Test-heavy codebase
Mock Eloquent itu ribet. Mock interface? Gampang.
$mock = Mockery::mock(PermohonanRepository::class);
$mock->shouldReceive('findById')->with(1)->andReturn(new Permohonan(...));Kapan Repository pattern OVERKILL
1. Project kecil / MVP
Project Tenun Maringkik cuma 8 tabel. Bikin Repository untuk masing-masing = 16 file ekstra (interface + implementation) tanpa nilai tambah real. Direct Eloquent call di controller udah cukup.
2. Tim solo / kecil
Kalau cuma kamu yang ngoding, konsistensi udah dijaga sendiri. Repository malah nambah friction tanpa benefit.
3. CRUD murni tanpa logic kompleks
Eloquent udah implement Active Record + Repository hybrid. Untuk User::find($id) bikin UserRepository->findById($id) cuma rename.
Pendekatan praktis: Service layer dulu
Daripada langsung jump ke Repository, mulai dengan Service class dulu untuk encapsulate business logic:
class PermohonanService {
public function approve(int $id, User $approver): Permohonan {
return DB::transaction(function () use ($id, $approver) {
$permohonan = Permohonan::findOrFail($id);
$permohonan->approve($approver);
event(new PermohonanApproved($permohonan));
return $permohonan;
});
}
}Service layer kasih 80% benefit Repository tanpa kompleksitas interface + implementation. Kalau project tumbuh dan butuh swap data source, baru extract ke Repository.
Kesimpulan
Repository pattern alat, bukan dogma. Pakai kalau punya alasan kongkret (multiple data source, tim besar, test-heavy). Kalau cuma karena "best practice katanya" — skip dulu, mulai dari Service. Banyak codebase Laravel yang stuck di kompleksitas Repository padahal cuma punya 1 source data.
Tulisan oleh M. Hidayatullah — Software Engineer Indonesia.
Diskusi Proyek →