← Kembali ke BlogLaravel

Pola Repository di Laravel: Kapan Worth It?

M. Hidayatullah·2026-03-28·6 min read
/ cover

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 →