Route Parameter dan Constraint
Tangkap nilai dinamis dari URL, batasi formatnya dengan constraint, dan pakai route model binding.
Parameter wajib dan opsional
Tulis parameter di dalam kurung kurawal. Nilainya otomatis diteruskan ke closure atau controller:
// routes/web.php
Route::get('/post/{id}', function (string $id) {
return "Menampilkan post dengan ID: {$id}";
});
// Parameter opsional: beri nilai default
Route::get('/user/{nama?}', function (string $nama = 'Tamu') {
return "Halo, {$nama}";
});Constraint: validasi format URL
Tanpa constraint, {id} menerima apa saja termasuk string acak. Batasi dengan where():
// routes/web.php
Route::get('/post/{id}', function (string $id) {
return "Post ID: {$id}";
})->where('id', '[0-9]+'); // hanya angka
Route::get('/user/{nama}', function (string $nama) {
return "User: {$nama}";
})->where('nama', '[A-Za-z]+'); // hanya huruf
// Beberapa parameter sekaligus
Route::get('/arsip/{tahun}/{bulan}', function (string $tahun, string $bulan) {
return "Arsip {$bulan}/{$tahun}";
})->where(['tahun' => '[0-9]{4}', 'bulan' => '[0-9]{2}']);Kalau format tidak cocok, Laravel otomatis mengembalikan 404. Rapi tanpa if-else manual.
Route model binding: parameter jadi model
Ini fitur favorit banyak developer Laravel. Daripada menerima ID lalu query manual, type-hint model langsung dan Laravel yang mengambilkannya:
// routes/web.php
use App\Models\Post;
Route::get('/post/{post}', function (Post $post) {
return view('posts.show', compact('post'));
});Laravel mencari Post dengan primary key sesuai nilai {post}. Kalau tidak ketemu, otomatis 404. Nama parameter route harus sama dengan nama variabel.
Catatan teknis: Secara default binding memakai primary key (
id). Kalau ingin binding pakai kolom lain misalnyaslug, override methodgetRouteKeyName()di model:public function getRouteKeyName(): string { return 'slug'; }. MakaRoute::get('/post/{post}')akan mencari berdasarkan kolomslug.