Tutorial Laravel #22: Resource Controller

1. Apa itu Resource Controller?

Resource controller adalah controller yang mengikuti konvensi RESTful Laravel - menyediakan 7 method standar untuk operasi CRUD: index, create, store, show, edit, update, destroy. Dengan satu baris Route::resource, semua route terdaftar otomatis.

2. Membuat Resource Controller

php artisan make:controller ArtikelController --resource
php artisan make:controller ArtikelController --resource --model=Artikel

3. Route Resource

// routes/web.php
Route::resource('artikel', ArtikelController::class);

// Lihat semua route yang dibuat
// php artisan route:list --name=artikel

Tabel route yang dihasilkan:

  • GET /artikel - index - artikel.index
  • GET /artikel/create - create - artikel.create
  • POST /artikel - store - artikel.store
  • GET /artikel/{artikel} - show - artikel.show
  • GET /artikel/{artikel}/edit - edit - artikel.edit
  • PUT/PATCH /artikel/{artikel} - update - artikel.update
  • DELETE /artikel/{artikel} - destroy - artikel.destroy

4. Membatasi Route yang Dibuat

// Hanya buat route tertentu
Route::resource('artikel', ArtikelController::class)
     ->only(['index', 'show']);

// Buat semua kecuali yang disebutkan
Route::resource('artikel', ArtikelController::class)
     ->except(['destroy']);

// Resource hanya untuk API (tidak ada create dan edit)
Route::apiResource('artikel', ArtikelController::class);

5. Nested Resource

Untuk relasi seperti artikel yang punya banyak komentar:

Route::resource('artikel.komentar', KomentarController::class);
// URL: /artikel/{artikel}/komentar
// URL: /artikel/{artikel}/komentar/{komentar}
public function store(Request $request, Artikel $artikel)
{
    $artikel->komentars()->create([
        'konten'  => $request->konten,
        'user_id' => auth()->id(),
    ]);

    return redirect()->route('artikel.show', $artikel);
}

6. Route Model Binding

Laravel secara otomatis melakukan query database saat kamu type-hint model di method controller:

// Laravel otomatis cari Artikel::where('id', $artikel)->firstOrFail()
public function show(Artikel $artikel)
{
    return view('artikel.show', compact('artikel'));
}

// Custom key binding - misal cari by slug
// Di Model:
public function getRouteKeyName()
{
    return 'slug';   // Laravel akan query WHERE slug = ?
}

// Di route:
Route::get('/artikel/{artikel}', [ArtikelController::class, 'show']);
// URL: /artikel/belajar-laravel akan cari slug = belajar-laravel

7. Multiple Resource Controllers

Route::resources([
    'artikel'  => ArtikelController::class,
    'kategori' => KategoriController::class,
    'tag'      => TagController::class,
]);

// Semua di bawah middleware auth
Route::middleware('auth')->group(function () {
    Route::resources([
        'artikel'  => ArtikelController::class,
        'kategori' => KategoriController::class,
    ]);
});

8. Ringkasan

  • Resource controller mengikuti konvensi RESTful dengan 7 method standar
  • Route::resource() membuat 7 route sekaligus dengan satu baris
  • Gunakan only() atau except() untuk membatasi route yang dibuat
  • Route model binding otomatis inject model berdasarkan ID atau custom key

Tutorial berikutnya membahas pagination di Laravel.


ariq fadhil

Im Ariq Tech, a Top Rated Fullstack Developer with 5+ years of experience, delivering high-quality solutions across 50+ projects.