Resource Controller
Di PHP Native, kamu membuat file terpisah untuk setiap operasi: create.php, update.php, delete.php. Di Laravel, semua operasi CRUD bisa dikelola dalam satu controller dengan konvensi penamaan yang rapi.
Inilah Resource Controller — controller yang mengikuti 7 method standar Laravel.
1. Membuat Resource Controller
# Buat controller dengan 7 method standar
php artisan make:controller ProdukController --resource
Artisan akan membuat controller dengan method-method ini:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProdukController extends Controller
{
// 1. Tampilkan daftar semua produk
public function index()
{
$produkList = Produk::latest()->paginate(10);
return view('produk.index', compact('produkList'));
}
// 2. Tampilkan form untuk membuat produk baru
public function create()
{
return view('produk.create');
}
// 3. Simpan produk baru ke database
public function store(Request $request)
{
$validated = $request->validate([
'nama' => 'required|string|max:255',
'harga' => 'required|numeric|min:1000',
]);
Produk::create($validated);
return redirect()->route('produk.index')
->with('success', 'Produk berhasil ditambahkan!');
}
// 4. Tampilkan detail satu produk
public function show(Produk $produk)
{
return view('produk.show', compact('produk'));
}
// 5. Tampilkan form untuk edit produk
public function edit(Produk $produk)
{
return view('produk.edit', compact('produk'));
}
// 6. Update produk di database
public function update(Request $request, Produk $produk)
{
$validated = $request->validate([
'nama' => 'required|string|max:255',
'harga' => 'required|numeric|min:1000',
]);
$produk->update($validated);
return redirect()->route('produk.index')
->with('success', 'Produk berhasil diupdate!');
}
// 7. Hapus produk dari database
public function destroy(Produk $produk)
{
$produk->delete();
return redirect()->route('produk.index')
->with('success', 'Produk berhasil dihapus!');
}
}
2. Mendaftarkan Resource Route
Di PHP Native, kamu harus mendaftarkan setiap URL satu per satu. Di Laravel, cukup satu baris:
// routes/web.php
use App\Http\Controllers\ProdukController;
// Satu baris ini menghasilkan 7 route sekaligus!
Route::resource('produk', ProdukController::class);
Yang akan menghasilkan:
Kamu bisa melihat semua route yang terdaftar dengan:
3. Route Model Binding
Perhatikan parameter Produk $produk di method seperti show() dan edit(). Ini namanya Route Model Binding — Laravel otomatis mencari data di database berdasarkan ID di URL.
// Tanpa Route Model Binding (cara manual)
public function show($id)
{
$produk = Produk::findOrFail($id); // Manual cari di DB
return view('produk.show', compact('produk'));
}
// Dengan Route Model Binding (cara Laravel!)
public function show(Produk $produk) // Laravel otomatis cari berdasarkan ID
{
return view('produk.show', compact('produk'));
}
Jika URL-nya /produk/5, Laravel otomatis menjalankan Produk::findOrFail(5). Jika produk dengan ID 5 tidak ada → otomatis 404.
Named Routes
Gunakan route() helper untuk membuat URL dari nama route:
// Di Blade
<a href="{{ route('produk.show', $produk) }}">Lihat Detail</a>
<a href="{{ route('produk.edit', $produk) }}">Edit</a>
// Di Controller
return redirect()->route('produk.index');
Keuntungannya: kalau kamu ubah URL dari /produk ke /barang, semua link otomatis ikut berubah!
<!-- resources/views/produk/index.blade.php -->
<h1>Daftar Produk</h1>
<a href="{{ route('produk.create') }}">+ Tambah Produk</a>
@foreach ($produkList as $produk)
<div style="border: 1px solid #ddd; padding: 1rem; margin: 0.5rem 0;">
<h3>{{ $produk->nama }}</h3>
<p>Rp {{ number_format($produk->harga, 0, ',', '.') }}</p>
<a href="{{ route('produk.show', $produk) }}">Detail</a>
<a href="{{ route('produk.edit', $produk) }}">Edit</a>
{{-- Form delete (karena DELETE butuh method spoofing) --}}
<form action="{{ route('produk.destroy', $produk) }}" method="POST"
style="display: inline;"
onsubmit="return confirm('Yakin mau hapus?')">
@csrf
@method('DELETE')
<button type="submit" style="color: red;">Hapus</button>
</form>
</div>
@endforeach
{{ $produkList->links() }} {{-- Pagination otomatis! --}}
Method Spoofing
HTML form hanya mendukung GET dan POST. Untuk PUT, PATCH, dan DELETE, Laravel menggunakan method spoofing: tambahkan @method('PUT') atau @method('DELETE') di dalam form. Jangan lupa @csrf untuk perlindungan CSRF! Kalau request tetap ditolak, cek CSRF Token Mismatch di Laravel.
5. Membatasi Method dengan only() dan except()
Kadang kamu tidak butuh semua 7 method:
// Hanya daftarkan route yang dibutuhkan
Route::resource('produk', ProdukController::class)
->only(['index', 'show']); // Hanya lihat, tanpa bisa tambah/edit/hapus
// Atau kebalikannya — semua kecuali...
Route::resource('produk', ProdukController::class)
->except(['destroy']); // Semua kecuali hapus
6. Nested Resources
Untuk relasi data, misalnya produk punya review:
Route::resource('produk.review', ReviewController::class);
Ini akan membuat URL seperti:
GET /produk/{produk}/review → Semua review produk tertentu
POST /produk/{produk}/review → Tambah review ke produk
DELETE /produk/{produk}/review/{review} → Hapus review
7. Perbandingan: PHP Native vs Laravel
Selanjutnya
Kamu sudah bisa membuat CRUD yang rapi! Untuk latihan yang lebih lengkap, praktikkan pola ini di Membuat CRUD Kategori dan Artikel dengan Laravel. Selanjutnya, bagaimana cara memastikan kode-mu berjalan benar? Lanjut ke Testing dengan Pest → untuk belajar menulis tes otomatis.
Troubleshooting Resource Route
Kalau route resource kamu menampilkan 404 yang aneh, model tidak pernah ter-resolve otomatis, migration gagal, atau file Blade tidak ditemukan, cek: