laravelroutingparameterPemula3 mnt baca

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:

php
// 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():

php
// 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:

php
// 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 misalnya slug, override method getRouteKeyName() di model: public function getRouteKeyName(): string { return 'slug'; }. Maka Route::get('/post/{post}') akan mencari berdasarkan kolom slug.