Route memasangkan satu method HTTP dan satu alamat dengan kode yang menjawabnya. Semua route web ditulis di routes/web.php. Bayangin petugas di pintu perpustakaan yang memegang daftar: "GET /books, ke rak daftar buku", "POST /books, ke meja pendaftaran buku baru". Tiap tamu dicocokkan dengan daftar itu dari atas ke bawah, dan baris pertama yang cocok yang dipakai.
🧪 Tebakan cepat:
Route::get('/books/{id}', ...)ditulis di atasRoute::get('/books/create', ...). Kamu membuka/books/create. Route mana yang menjawab? Tebak dulu, jawabannya ada di bagian "Urutan: yang pertama cocok menang".
Route dasar
Ini routes/web.php app Perpustakaan di pelajaran ini:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/books', function () {
return response()->json(['Laskar Pelangi', 'Bumi Manusia', 'Cantik Itu Luka']);
})->name('books.index');
Route::get('/books/{id}', function (string $id) {
return response()->json(['id' => $id]);
})->name('books.show');
Route::get('/books/create', function () {
return 'Form tambah buku';
})->name('books.create');
Route::post('/books', function () {
return response()->json(['message' => 'created'], 201);
})->name('books.store');
Route::get('/authors/{name?}', function (?string $name = null) {
return $name ?? 'Semua penulis';
})->name('authors');
Route::getdanRoute::postmendaftarkan alamat untuk satu method. Ada jugaRoute::put,Route::patch, danRoute::delete. RouteGETotomatis menjawabHEADjuga.- Function kedua adalah kode yang menjawab. Yang di-
returnjadi response: string jadi HTML,response()->json(...)jadi JSON. response()->json([...], 201)mengirim status201 Created. Tanpa angka kedua, status-nya200 OK.->name('books.index')memberi route itu nama. Gunanya ada di bagian "Nama route dan route()".
Parameter di alamat
Bagian alamat dalam kurung kurawal adalah parameter: nilainya diambil dari alamat lalu dikirim ke function, berurutan dari kiri.
| Request | Route yang menjawab | Parameter | Jawaban |
|---|---|---|---|
GET /books |
books.index |
(gak ada) | 200 daftar tiga judul |
GET /books/2 |
books.show |
$id = '2' |
200 {"id":"2"} |
POST /books |
books.store |
(gak ada) | 201 {"message":"created"} |
GET /authors |
authors |
$name = null |
200 Semua penulis |
GET /authors/Andrea |
authors |
$name = 'Andrea' |
200 Andrea |
DELETE /books/2 |
(gak ada) | 405 Method Not Allowed |
|
GET /tentang |
(gak ada) | 404 Not Found |
{id}cocok dengan satu segmen apa saja selain/:2,abc, jugacreate. Nilainya selalu string,'2', bukan angka2.{name?}dengan tanda tanya boleh gak ada. Function-nya wajib punya nilai bawaan,?string $name = null, untuk saat alamatnya cuma/authors.- Alamatnya ada tapi method-nya beda, Laravel menjawab
405, bukan404. Pesannya:The DELETE method is not supported for route books/2. Supported methods: GET, HEAD.
Urutan: yang pertama cocok menang
Laravel mengecek route sesuai urutan di file. /books/create dicek ke books.index (gak cocok), lalu ke books.show: {id} mau menerima create, jadi books.show yang menjawab dengan {"id":"create"}. Route books.create di bawahnya gak pernah dicek. Itu jawaban tebakannya.
Ada dua cara memperbaikinya:
// 1. Tulis alamat yang tetap di atas alamat yang berparameter
Route::get('/books/create', ...)->name('books.create');
Route::get('/books/{id}', ...)->name('books.show');
// 2. Atau batasi parameternya: id cuma boleh angka
Route::get('/books/{id}', ...)->whereNumber('id')->name('books.show');
->whereNumber('id') sama dengan ->where('id', '[0-9]+'). Dengan batasan itu, /books/create dan /books/abc gak cocok lagi dengan books.show. /books/abc jadi 404.
Nama route dan route()
Nama membuatmu bisa menulis alamat tanpa mengetiknya:
route('books.index'); // http://127.0.0.1:8000/books
route('books.show', ['id' => 2]); // http://127.0.0.1:8000/books/2
route('books.show', ['id' => 2, 'tab' => 'ulasan']); // http://127.0.0.1:8000/books/2?tab=ulasan
- Kalau alamatnya nanti diganti, misalnya jadi
/koleksi/{id}, semuaroute('books.show', ...)ikut berubah sendiri. - Isian yang bukan parameter route jadi query string, seperti
?tab=ulasan. - Lupa parameternya:
Missing required parameter for [Route: books.show] [URI: books/{id}] [Missing parameter: id].Salah ketik nama:Route [buku.show] not defined.
Nama dengan titik seperti books.index dan siswa.index cuma kebiasaan penamaan, bukan folder.
Melihat semua route
php artisan route:list mencetak semua route, diurutkan menurut alamat. --except-vendor menyembunyikan route bawaan package, seperti up:
$ php artisan route:list --except-vendor
GET|HEAD authors/{name?} ............. authors › routes/web.php:21
GET|HEAD books .................... books.index › routes/web.php:5
POST books ................... books.store › routes/web.php:17
GET|HEAD books/create ........... books.create › routes/web.php:13
GET|HEAD books/{id} ................ books.show › routes/web.php:9
Showing [5] routes
Kolomnya: method, alamat, lalu nama dan baris kode yang menjawabnya.
⚠️ Jebakan yang sering ketemu
{id}menelan alamat tetap. Tulis/books/createdi atas/books/{id}, atau pakai->whereNumber('id').- Lupa status
201.response()->json([...])tanpa angka kedua selalu200. Latihannya mengharapkan transkripGET /products → 200danPOST /products → 201, jadi route POST-nya ditulisresponse()->json([...], 201). - POST lewat curl ke
routes/web.phpdijawab419 | Page Expired. Route web dijaga dari pemalsuan request (CSRF). Form di halamanmu sendiri lolos, request dari luar ditolak. Ini dibahas di pelajaran Request & Response. - Method salah. Alamat yang cuma punya route
POST, kalau dibuka dari address bar browser (yang selalu mengirimGET), dijawab405.
TL;DR: Route::get('/alamat', function () { ... }) memasangkan method dan alamat dengan kodenya, di routes/web.php. {id} menangkap satu segmen apa saja sebagai string, {id?} boleh kosong asal function-nya punya nilai bawaan, dan ->whereNumber('id') membatasinya ke angka. Route dicek dari atas, yang pertama cocok menang. Gak ada yang cocok: 404; alamatnya ada tapi method-nya beda: 405. ->name('books.show') memberi nama, route('books.show', ['id' => 2]) membuat alamatnya, dan php artisan route:list menampilkan semuanya. response()->json([...], 201) untuk data baru.