Routing — Laravel

Route mendefinisikan URL apa yang bisa diakses dan bagaimana meresponsnya. Route dasar: // routes/web.php atau routes/api.php Route::get("/hello", function ()…

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 atas Route::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');

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

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

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

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.

Yang akan kamu pelajari