Routing adalah lapisan pertama yang menyambut setiap request, sekaligus API yang paling sering kita sentuh saat membangun fitur baru. Setelah menyelesaikan section Routing dan Request
, kita sebenarnya hanya bermain dengan belasan method — sisanya adalah variasi. Chapter ini merangkum seluruh method tersebut: verb HTTP, parameter beserta constraint-nya, opsi grouping, sampai tabel tujuh route hasil Route::resource. Semua contoh output di bawah diambil dari eksekusi nyata route:list di sandbox Course ini.
Satu konteks penting sebelum membuka tabel: pada struktur Laravel modern, route tidak lagi terdaftar di RouteServiceProvider, melainkan lewat withRouting() di bootstrap/app.php — topik yang kita bahas di Konsep Routing
. File utamanya adalah routes/web.php untuk halaman ber-session, sementara routes/api.php (bila dipasang lewat php artisan install:api) otomatis mendapat prefix /api tanpa state session.
Verb dan Cara Pendaftaran #
| Method | Kegunaan | Contoh |
|---|---|---|
Route::get($uri, $aksi) | Baca data / halaman | Route::get('/tugas', [TugasController::class, 'index']) |
Route::post(...) | Kirim data baru | Route::post('/tugas', [TugasController::class, 'store']) |
Route::put / Route::patch | Ubah data | Route::put('/tugas/{tugas}', [TugasController::class, 'update']) |
Route::delete(...) | Hapus data | Route::delete('/tugas/{tugas}', [TugasController::class, 'destroy']) |
Route::options(...) | Menangani verb OPTIONS | jarang ditulis manual |
Route::match(['get','post'], ...) | Beberapa verb sekaligus | match(['get', 'post'], '/pilih', ...) |
Route::any(...) | Semua verb sekaligus | hindari di kode publik |
Route::view($uri, $view) | URI → view tanpa controller | Route::view('/tentang', 'tentang') |
Route::redirect($a, $b, 301) | Arahkan URI | Route::redirect('/lama', '/baru', 301) |
Route::permanentRedirect($a, $b) | Redirect 301 permanen | — |
Route::fallback($aksi) | Penampung 404 terakhir | halaman “tidak ditemukan” kustom |
Setiap route juga bisa diberi nama untuk dipanggil dari route() dan redirect()->route() — idiom yang dibahas di Named Routes
. Route pembacaan data dengan parameter model langsung terikat lewat route model binding, dibahas di Route Model Binding
.
Parameter dan Constraint #
| Bentuk | Perilaku | Contoh |
|---|---|---|
{id} | Wajib diisi | /tugas/{id} |
{id?} | Opsional (beri default di aksi) | function ($id = null) |
->where('id', '[0-9]+') | Constraint regex | hanya angka |
->whereNumber('id') | Sama, versi ringkas | hanya angka |
->whereAlpha('slug') | Hanya huruf | — |
->whereAlphaNumeric('slug') | Huruf + angka | — |
->whereUuid('id') | Format UUID | — |
->whereIn('status', ['todo','done']) | Daftar nilai | — |
->where(['id' => '[0-9]+', ...]) | Banyak constraint | array asosiatif |
Constraint mencegah controller menerima nilai aneh sekaligus memisahkan rute seperti /tugas/5 dari /tugas/belajar-laravel — penjelasan lengkapnya di Route Constraints
.
Opsi Grouping #
| Opsi | Efek | Contoh |
|---|---|---|
->prefix('admin') | Awalan URI bersama | /admin/tugas |
->middleware(...) | Middleware untuk semua anggota | ['auth', 'verified'] |
->name('admin.') | Awalan nama route | admin.tugas.index |
->controller(X::class) | Controller bersama | cukup tulis 'index' |
->domain('{akun}.app.test') | Subdomain dinamis | multi-tenant |
Tiga opsi pertama biasanya dikombinasikan dalam satu grup admin, persis pola yang dibedah di Route Groups
. Manfaat grouping bukan sekadar singkat — grup juga menjadi satu-satunya tempat pemasangan middleware, sehingga membaca satu blok Route::middleware(...)->group(...) langsung menjelaskan seluruh aturan akses di dalamnya tanpa memeriksa route satu per satu.
Resource dan apiResource #
Route::resource membangkitkan tujuh route CRUD standar dalam satu baris. Tabel ini adalah hasil nyata php artisan route:list --path=tugas di sandbox:
GET|HEAD tugas .................. tugas.index › TugasController@index
POST tugas .................. tugas.store › TugasController@store
GET|HEAD tugas/create ......... tugas.create › TugasController@create
GET|HEAD tugas/{tuga} ............. tugas.show › TugasController@show
PUT|PATCH tugas/{tuga} ......... tugas.update › TugasController@update
DELETE tugas/{tuga} ....... tugas.destroy › TugasController@destroy
GET|HEAD tugas/{tuga}/edit ........ tugas.edit › TugasController@editPerhatikan parameter {tuga} di kolom URI: Laravel mengsingularisasi nama resource, dan “tugas” dipangkas menjadi “tuga” — perilaku yang mengejutkan bagi kita penutur bahasa Indonesia. Solusinya adalah ->parameters(['tugas' => 'tugas']) agar parameter kembali bernama {tugas}. Modifikasi lain yang sering dipakai: ->only(['index', 'show']) dan ->except(['destroy']) memangkas route, ->shallow() meringkas resource bersarang, dan Route::apiResource membuang create serta edit yang tidak relevan untuk API — tinggal lima route tersisa, pola lengkapnya di API Routing
. Untuk endpoint yang hanya dipanggil aplikasi pihak ketiga, pertimbangkan juga membungkus semuanya dengan prefix v1 seperti dibahas di API Versioning
.
Membaca route:list #
| Flag | Kegunaan |
|---|---|
--path=tugas | Hanya route yang URI-nya cocok |
--name=tugas | Filter berdasarkan nama route |
--method=POST | Filter berdasarkan verb |
--except-vendor | Sembunyikan route bawaan paket |
--json | Output JSON untuk skrip |
Flag --except-vendor sangat berguna pada proyek dengan banyak paket terpasang, karena route bawaan Sanctum atau Horizon bisa memenuhi layar. Flag-flag ini boleh dikombinasikan — misalnya route:list --path=tugas --except-vendor — dan outputnya persis tabel yang kita lihat di atas. Kebiasaan membaca tabel ini cepat adalah kunci debugging 404 yang dibahas di Route List dan Debugging
dan Panduan Debugging
.
Route dan view sudah terpetakan di dua kartu sebelumnya. Kartu berikutnya merangkum lapisan yang memastikan semuanya tetap benar saat kode berubah: Referensi Testing .