Named Route dan Route Cache
Beri nama pada route, generate URL aman, dan percepat dengan route:cache.
Analogi: Nama Kontak vs Nomor Telepon
Kamu tidak menghapal nomor telepon temanmu, kamu menyimpan namanya di kontak. Nomornya ganti? Kamu update sekali di kontak, semua chat dan panggilan tetap jalan karena merujuk ke nama, bukan nomor.
Named route adalah kontak itu. Daripada menulis URL mentah (/post/42) di semua Blade dan controller, kamu memberi nama (posts.show) dan memanggilnya lewat helper route(). URL-nya berubah besok? Ubah sekali di routes/web.php, seluruh aplikasi ikut update.
Kenapa Named Route Ada? Masalah Apa yang Diselesaikan?
Aplikasi nyata merujuk URL yang sama di puluhan tempat: menu navigasi, tombol "kembali", redirect setelah form, email notifikasi. Kalau URL ditulis mentah di mana-mana, mengganti satu URL berarti berburu ke puluhan file, dan satu yang terlewat jadi link mati.
Named route menyelesaikan masalah ** kerapuhan referensi**: kode merujuk ke nama yang stabil, bukan URL yang bisa berubah. Ini penerapan prinsip DRY (Don't Repeat Yourself) untuk URL.
Lalu route cache menyelesaikan masalah kecepatan: di production dengan ratusan route, Laravel tidak perlu mem-parsing file route setiap request. Ia membaca satu file cache yang sudah jadi, jauh lebih cepat.
Contoh 1: Memberi Nama dan Memakainya
// routes/web.php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/post/{post}', [PostController::class, 'show'])->name('posts.show');{{-- resources/views/posts/index.blade.php: link antar halaman --}}
@foreach ($posts as $post)
<a href="{{ route('posts.show', ['post' => $post->id]) }}">
{{ $post->title }}
</a>
@endforeach
{{-- hasil: <a href="http://localhost:8000/post/5">...</a> --}}// app/Http/Controllers/PostController.php: redirect setelah simpan
public function store(Request $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', ['post' => $post->id]);
// atau lebih singkat: return redirect()->route('posts.show', $post);
}Besok kamu ubah URL jadi /artikel/{post}? Cukup edit satu baris di routes/web.php. Semua route('posts.show', ...) otomatis mengikuti.
Contoh 2: Route Cache untuk Production
# Di server production: compile semua route jadi satu file cache
php artisan route:cache
# output: INFO Routes cached successfully.
# Saat development (route sering berubah): hapus cache
php artisan route:clear
# Cek apakah cache aktif:
php artisan route:list
# kalau cache aktif, daftar route dibaca dari cache, bukan fileAlur kerja yang benar: development tanpa cache (supaya perubahan route langsung terasa), production dengan cache (supaya cepat). Banyak error misterius "route baru tidak jalan di server" penyebabnya adalah lupa route:clear/route:cache ulang setelah deploy.
Catatan teknis:
route:cacheGAGAL total kalau ada satu saja route berupa closure, karena closure tidak bisa di-serialize ke file cache. Errornya: "Unable to prepare route [...] for serialization". Ini alasan kuat kenapa project serius tidak memakai closure di route: semua route harus menunjuk ke controller. Anggap ini Laravel yang memaksamu menulis kode rapi.
Kesalahan Umum Pemula
Salah: mencampur URL mentah dan named route, lalu pusing saat URL berubah.
// SALAH: sebagian pakai nama, sebagian hardcode URL
// di Blade: <a href="/post/{{ $post->id }}"> (hardcode!)
// di controller: return redirect()->route('posts.show', $post); (pakai nama)
// → ubah URL, yang hardcode jadi link mati{{-- BENAR: konsisten pakai route() di semua tempat --}}
<a href="{{ route('posts.show', $post) }}">{{ $post->title }}</a>// BENAR: di controller juga pakai nama
return redirect()->route('posts.index');Salah: menjalankan route:cache saat masih development lalu bingung kenapa route baru tidak terbaca.
# SALAH: iseng menjalankan route:cache di laptop
php artisan route:cache
# lalu tambah route baru di web.php → tidak jalan! karena yang dibaca adalah cache lama# BENAR: di local, pastikan tidak ada cache route
php artisan route:clear
# Atau kalau mau aman total:
php artisan optimize:clear # hapus SEMUA cache (route, config, view)Aturannya: route:cache hanya di production (biasanya otomatis lewat skrip deploy). Di laptop, jangan pernah.
Rangkuman
Named route membuat URL bisa berubah tanpa merusak aplikasi: beri ->name(), panggil lewat route(). Route cache mempercepat production dengan meng-compile route jadi satu file, tapi ia menuntut semua route memakai controller (tanpa closure). Berikutnya: memindahkan logika dari route ke controller.
Tantangan
Refactor ke Named Route
Ubah semua route closure di project latihanmu menjadi named route ke controller. Jalankan php artisan route:cache dan pastikan sukses.