Sejauh ini kita memanggil route lewat URI-nya secara langsung: menulis href="/tugas" di view, redirect('/tugas') di controller, dan seterusnya. Pendekatan tersebut rapuh: begitu URI berubah — misalnya /tugas menjadi /daftar-tugas — kita harus memburu setiap tempat yang menuliskannya, dan satu saja yang terlewat menghasilkan link mati. Laravel menawarkan lapisan tidak langsung yang aman: named route. Kita memberi setiap route sebuah nama unik, lalu menghasilkan URL dan redirect dari nama tersebut, sehingga URI boleh berubah kapan pun tanpa menyentuh view maupun controller.

Memberi Nama pada Route #

Penamaan dilakukan dengan method ->name() yang dirantai setelah definisi route. Mulailah dengan dua route pertama di routes/web.php:

php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::get('/dasbor', fn () => 'Ini dasbor.')->name('dasbor');

Route::get('/profil/{pengguna}', function (string $pengguna) {
    return "Profil pengguna {$pengguna}";
})->name('profil.show');

Dua route tersebut kini bernama dasbor dan profil.show. Kebiasaan penamaan yang umum adalah pola sumber.tindakan — profil.show, profil.edit, tugas.store — sehingga nama tetap terbaca saat daftar route memanjang. Nama sepenuhnya bebas; yang penting unik di seluruh aplikasi, karena helper route() selalu mengembalikan satu URL untuk satu nama. Penamaan juga memisahkan dua kepentingan yang berbeda: URI adalah urusan bagaimana aplikasi terlihat dari luar, sedangkan nama adalah kontrak internal antara route dengan view, controller, dan test — pengubahan salah satunya tidak boleh menyentuh yang lain.

Menghasilkan URL dengan helper route() #

Helper global route() menerima nama route dan mengembalikan URL lengkapnya. Untuk route berparameter, nilai parameternya dikirim sebagai array asosiatif. Tambahkan dua route berikut yang memakai helper tersebut:

php
// Redirect memakai nama route beserta parameternya
Route::get('/profil-lama', function () {
    return redirect()->route('profil.show', ['pengguna' => 'budi']);
});

// Menghasilkan URL dari nama route, lalu ditampilkan sebagai JSON
Route::get('/menu', function () {
    return [
        'dasbor' => route('dasbor'),
        'profil' => route('profil.show', ['pengguna' => 'siti']),
    ];
});

Perhatikan dua pemakaian yang berbeda: redirect()->route() langsung menghasilkan response redirect, sedangkan route() hanya menghasilkan string URL yang bisa dipakai di mana saja — dalam JSON, atribut href, atau penyusunan menu. Kedua bentuk tersebut tidak pernah menuliskan URI profil/{pengguna} sama sekali; perubahan URI cukup dilakukan sekali di definisi route.

Memeriksa Route yang Sedang Berjalan #

Sesekali handler perlu tahu nama route yang sedang dieksekusi — misalnya untuk menandai menu aktif. Tambahkan satu route terakhir:

php
// Memeriksa nama route yang sedang berjalan
Route::get('/cek-posisi', function (Request $request) {
    return [
        'nama' => $request->route()->getName(),
        'namakah' => $request->route()->named('cek-posisi') ? 'ya' : 'bukan',
    ];
})->name('cek-posisi');

Method getName() mengembalikan nama route aktif, sedangkan named() memeriksa kecocokan dengan nama tertentu. Alternatif setara lewat facade Route::currentRouteNamed('cek-posisi') menghasilkan nilai yang sama — kita memverifikasinya langsung di aplikasi uji.

Menguji Kelima Route Sekaligus #

Kelima route kini lengkap. Skrip uji-route.php dari chapter-chapter sebelumnya menguji tiga endpoint yang paling banyak melibatkan nama — redirect, pembangkit URL, dan pemeriksa nama:

php
<?php

// uji-route.php — jalankan dari root proyek Laravel
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

require __DIR__.'/vendor/autoload.php';
$app = require __DIR__.'/bootstrap/app.php';

$kernel = $app->make(Kernel::class);

$permintaan = [
    ['GET', '/profil-lama'],
    ['GET', '/menu'],
    ['GET', '/cek-posisi'],
];

foreach ($permintaan as [$method, $uri]) {
    $response = $kernel->handle(
        Request::create('http://localhost:8000'.$uri, $method)
    );
    $isi = $response->headers->get('Location') ?? trim($response->getContent());
    echo str_pad("{$method} {$uri}", 18)
        ." → HTTP ".$response->getStatusCode()
        .' | '.$isi.PHP_EOL;
}

Output yang Dihasilkan:

text
GET /profil-lama   → HTTP 302 | http://localhost:8000/profil/budi
GET /menu          → HTTP 200 | {"dasbor":"http:\/\/localhost:8000\/dasbor","profil":"http:\/\/localhost:8000\/profil\/siti"}
GET /cek-posisi    → HTTP 200 | {"nama":"cek-posisi","namakah":"ya"}

Baris pertama menunjukkan redirect()->route('profil.show', ['pengguna' => 'budi']) menghasilkan redirect 302 ke http://localhost:8000/profil/budi — parameter pengguna otomatis disisipkan ke URI-nya, dan Location header yang tercetak adalah URL tujuan yang akan diikuti browser. Bagian http://localhost:8000 mengikuti host request saat ini (server development php artisan serve berjalan di port 8000); di luar konteks request — misalnya di dalam Artisan command — helper route() jatuh kembali ke nilai APP_URL di berkas .env, yang juga kita verifikasi bernilai http://localhost:8000 di aplikasi uji. Baris kedua memperlihatkan helper route() menghasilkan URL lengkap untuk menu tanpa parameter dan untuk route berparameter, dan baris ketiga mengonfirmasi named() mengembalikan "ya" untuk route aktif.

Melihat Seluruh Nama di route:list #

Daftar nama seluruh route bisa kita lihat kapan saja lewat route:list. Kolom tengah output berikut menampilkan nama sebelum tanda ›:

bash
php artisan route:list --except-vendor

Output yang Dihasilkan:

text
  GET|HEAD       cek-posisi ....................................... cek-posisi › routes/web.php:26
  GET|HEAD       dasbor ................................................ dasbor › routes/web.php:6
  GET|HEAD       menu .......................................................... routes/web.php:18
  GET|HEAD       profil-lama ................................................... routes/web.php:13
  GET|HEAD       profil/{pengguna} ................................ profil.show › routes/web.php:8

                                                                                Showing [5] routes

Dua route tanpa nama (menu dan profil-lama) tampil tanpa awalan nama, sedangkan tiga lainnya menampilkan namanya. Dengan nama sebagai penghubung, URI menjadi detail internal yang bebas kita ubah.

Namun aplikasi nyata jarang sekecil lima route. Saat daftar memanjang, pola berulang muncul: ratusan route berawalan /admin, puluhan route ber-middleware sama, seluruh route controller yang sama. Menulis atribut itu satu per satu membosankan dan rawan lupa — masalah yang diselesaikan route groups di chapter berikutnya.