Routing adalah pintu masuk paling dasar di Laravel: setiap request HTTP yang masuk akan dicocokkan dengan salah satu route di routes/web.php. Di episode ini kita eksplorasi berbagai bentuk routing lewat closure dulu, sebelum masuk ke controller di episode berikutnya.
Route parameter /hello/{name} menangkap nilai dari URL.
Route paling sederhana
Route::get('/hello', function () {
return 'Hello, Laravel 13!';
});
Setiap Route::get() menerima dua argumen: URI dan closure (atau controller) yang dijalankan saat route itu diakses. Buka http://laravel13-blog-dasar.test/hello dan kamu akan lihat teks itu langsung.
Route parameter — wajib
Kadang kita perlu menangkap bagian dari URL sebagai variabel, misalnya nama di /hello/sugiarto:
Route::get('/hello/{name}', function (string $name) {
return "Hello, {$name}!";
});
Laravel otomatis inject nilai {name} dari URL ke parameter $name di closure — tidak perlu parsing manual.
Route parameter — opsional
Kalau parameter boleh kosong, tambahkan ? setelah nama parameter dan beri default value di closure:
Route::get('/product/{id?}', function (?string $id = null) {
return $id ? "Product detail #{$id}" : 'All products';
});
Akses /product (tanpa ID) akan menampilkan "All products", sedangkan /product/5 menampilkan "Product detail #5".
Named route
Menulis URL secara hardcoded di banyak tempat (blade view, redirect, dll) itu rapuh — kalau URL berubah, kamu harus cari-ganti manual di semua tempat. Solusinya: named route.
Route::get('/about', function () {
return view('about');
})->name('about');
Di mana pun, kamu tinggal panggil route('about') dan Laravel otomatis generate URL yang benar, bahkan kalau URI-nya berubah nanti.
Form GET + POST
Untuk form, kita butuh dua route: satu untuk menampilkan form (GET), satu untuk menerima submission-nya (POST):
Route::get('/contact', function () {
return view('contact');
})->name('contact.form');
Route::post('/contact', function () {
$name = request('name');
return "Thanks, your message from {$name} has been received!";
})->name('contact.submit');
View contact.blade.php berisi form HTML biasa dengan directive @csrf — token ini wajib ada di setiap form POST Laravel untuk proteksi CSRF:
<form method="POST" action="{{ route('contact.submit') }}">
@csrf
<label for="name">Name:</label>
<input type="text" name="name" id="name" required>
<button type="submit">Send</button>
</form>
Tanpa @csrf, Laravel akan menolak request POST dengan error 419 (Page Expired).
Testing manual
Coba akses semua route ini satu per satu di browser atau lewat curl:
curl http://laravel13-blog-dasar.test/hello
curl http://laravel13-blog-dasar.test/hello/Budi
curl http://laravel13-blog-dasar.test/product
curl http://laravel13-blog-dasar.test/product/5
Kamu juga bisa lihat semua route yang terdaftar dengan:
php artisan route:list
Selanjutnya
Menulis semua logic langsung di closure routes/web.php cepat memberantakkan file itu begitu aplikasi membesar. Di episode berikutnya kita pindahkan logic ke controller, khususnya resource controller yang otomatis menangani 7 aksi RESTful sekaligus.