Menguasai routing Laravel: Route::get/post/put/delete, parameter {id} dengan constraint, named routes, route groups, fallback 404, hingga pemeliharaan route dengan php artisan route:list di Laravel 13.

Setelah di episode 3 proyek Laravel 13 kalian berjalan, sekarang kita masuk ke gerbang utama aplikasi: routing. Route adalah peta yang menghubungkan URL yang diketik user ke kode yang menanganinya. Di episode 2 kita sudah melihat alur request; sekarang kita pelajari cara menulis definisi route yang benar — dari yang paling sederhana sampai yang siap produksi.
Routing yang rapi bukan soal estetika: ini menentukan kemudahan maintenance, kejelasan URL (SEO & UX), dan bagaimana middleware diterapkan di episode-episode berikutnya.
Laravel menyediakan method sesuai dengan verb HTTP:
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::put('/posts/{post}', [PostController::class, 'update']);
Route::delete('/posts/{post}', [PostController::class, 'destroy']);Perhatikan pola RESTful: GET untuk membaca, POST untuk membuat, PUT/PATCH untuk mengupdate, DELETE untuk menghapus. Laravel juga punya Route::patch() untuk update parsial dan Route::any() untuk semua method — tapi any jarang dipakai karena melonggarkan kontrol.
Route dengan closure juga valid, meskipun untuk kode produksi selalu lebih baik memakai controller:
Route::get('/hello', function () {
return 'Halo dari route!';
});Kita bisa menangkap bagian dari URL memakai {...}:
Route::get('/posts/{post}/edit', function ($post) {
return "Edit post id: {$post}";
});Parameter ini dibatasi dengan regular expression agar route tidak menerima nilai tak terduga:
Route::get('/users/{user}', function ($user) {
return "User id: {$user}";
})->where('user', '[0-9]+');->where('user', '[0-9]+') memastikan hanya angka yang diterima — mengakses /users/abc akan menghasilkan 404, bukan error. Di Laravel modern, jika route berparameter dan dibuka dengan model di controller, ini biasanya diganti route model binding — kita lihat di episode 7.
Tip
Urutan route itu penting: Laravel mencocokkan dari atas ke bawah. Taruh route yang lebih spesifik di atas route yang lebih umum. Contohnya Route::get('/posts/create') harus ditulis sebelum Route::get('/posts/{post}') — kalau tidak, kata "create" akan ditangkap sebagai nilai {post}.
Memberi nama pada route membuat URL bisa dirujuk dari mana saja tanpa menulis string URL secara manual:
Route::get('/posts/{post}', [PostController::class, 'show'])
->name('posts.show');Penggunaan di kode dan Blade:
$url = route('posts.show', ['post' => 42]);<a href="{{ route('posts.show', $post) }}">Lihat Post</a>Keuntungannya besar: jika URL berubah, kalian cukup mengubah satu tempat (definisi route) — seluruh tautan otomatis ikut. Nama route juga menjadi dasar untuk memeriksa halaman aktif di navigasi (request()->routeIs('posts.*')).
Route yang berbagi prefix atau middleware bisa dikelompokkan:
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index'])
->name('dashboard');
Route::get('/settings', [SettingsController::class, 'index'])
->name('settings');
});Dengan kode di atas, URL yang dihasilkan /admin/dashboard dan /admin/settings, dengan nama admin.dashboard dan admin.settings. Group juga bisa menambahkan middleware — misalnya ->middleware('auth') untuk melindungi seluruh halaman admin — kita bahas di episode 10.
php artisan route:list adalah peta lengkap aplikasi kalian:
php artisan route:listOutput-nya menampilkan method, URI, nama, dan handler tiap route — sangat berguna untuk menemukan konflik atau sekadar memahami aplikasi orang lain. Saring dengan --path atau --name untuk pencarian cepat:
php artisan route:list --path=posts
php artisan route:list --name=adminRoute fallback menangkap semua URL yang tidak cocok dengan route manapun — berguna untuk halaman "Not Found" custom:
Route::fallback(function () {
return response('Halaman tidak ditemukan', 404);
});Route::fallback() harus didefinisikan paling akhir di file route — posisinya hanya berfungsi sebagai jaring pengaman untuk request yang tidak terjawab.
Inti yang harus dibawa pulang:
get/post/put/delete; hindari any.{id} bisa dibatasi dengan ->where() constraint; perhatikan urutan route.->name()) wajib dibiasakan — akses lewat route().php artisan route:list dan Route::fallback() menjaga aplikasi tetap terpelihara.Di episode 5 selanjutnya kita akan membahas controllers & request — membuat controller dengan php artisan make:controller, resource controllers, dependency injection, $request->validate(), Form Request classes, dan urutan middleware pada request lifecycle. Sampai jumpa di episode 5!