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 #

MethodKegunaanContoh
Route::get($uri, $aksi)Baca data / halamanRoute::get('/tugas', [TugasController::class, 'index'])
Route::post(...)Kirim data baruRoute::post('/tugas', [TugasController::class, 'store'])
Route::put / Route::patchUbah dataRoute::put('/tugas/{tugas}', [TugasController::class, 'update'])
Route::delete(...)Hapus dataRoute::delete('/tugas/{tugas}', [TugasController::class, 'destroy'])
Route::options(...)Menangani verb OPTIONSjarang ditulis manual
Route::match(['get','post'], ...)Beberapa verb sekaligusmatch(['get', 'post'], '/pilih', ...)
Route::any(...)Semua verb sekaligushindari di kode publik
Route::view($uri, $view)URI → view tanpa controllerRoute::view('/tentang', 'tentang')
Route::redirect($a, $b, 301)Arahkan URIRoute::redirect('/lama', '/baru', 301)
Route::permanentRedirect($a, $b)Redirect 301 permanen—
Route::fallback($aksi)Penampung 404 terakhirhalaman “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 #

BentukPerilakuContoh
{id}Wajib diisi/tugas/{id}
{id?}Opsional (beri default di aksi)function ($id = null)
->where('id', '[0-9]+')Constraint regexhanya angka
->whereNumber('id')Sama, versi ringkashanya angka
->whereAlpha('slug')Hanya huruf—
->whereAlphaNumeric('slug')Huruf + angka—
->whereUuid('id')Format UUID—
->whereIn('status', ['todo','done'])Daftar nilai—
->where(['id' => '[0-9]+', ...])Banyak constraintarray asosiatif

Constraint mencegah controller menerima nilai aneh sekaligus memisahkan rute seperti /tugas/5 dari /tugas/belajar-laravel — penjelasan lengkapnya di Route Constraints .

Opsi Grouping #

OpsiEfekContoh
->prefix('admin')Awalan URI bersama/admin/tugas
->middleware(...)Middleware untuk semua anggota['auth', 'verified']
->name('admin.')Awalan nama routeadmin.tugas.index
->controller(X::class)Controller bersamacukup tulis 'index'
->domain('{akun}.app.test')Subdomain dinamismulti-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:

text
  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@edit

Perhatikan 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 #

FlagKegunaan
--path=tugasHanya route yang URI-nya cocok
--name=tugasFilter berdasarkan nama route
--method=POSTFilter berdasarkan verb
--except-vendorSembunyikan route bawaan paket
--jsonOutput 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 .