Route Laravel: Panduan Routing Laravel 12 dengan Contoh Kode

laravel

Route di Laravel adalah aturan yang menentukan kode mana yang dijalankan ketika sebuah URL diakses. Semua route untuk halaman web ditulis di routes/web.php, misalnya Route::get('/halo', fn () => 'Halo');. Panduan ini membahas routing di Laravel 12 dari dasar: method HTTP, parameter dan validasinya, named route, route group, route ke controller, route model binding, sampai cara mengecek dan men-cache route. Semua contoh sudah kami jalankan dan uji dengan feature test di Laravel 12.70.

Belum punya project? Ikuti dulu cara install Laravel 12. Materi lain tersusun berurutan di halaman tutorial Laravel.

File Route di Laravel 12

File Isi Keterangan
routes/web.php Route halaman web Mendapat session, cookie, dan proteksi CSRF
routes/console.php Command Artisan berbasis closure dan jadwal (scheduler) Bukan route HTTP
routes/api.php Route API, otomatis berawalan /api Tidak ada secara bawaan. Buat dengan php artisan install:api

Semua file route didaftarkan di bootstrap/app.php. Laravel 12 tidak lagi memakai RouteServiceProvider seperti Laravel 10 ke bawah.

Route Dasar dan Method HTTP

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

Route::get('/halo', function () {
    return 'Halo dari Laravel 12';
});

Route::post('/kontak', function (Request $request) {
    return 'Pesan dari ' . $request->input('nama');
});

Method yang tersedia mengikuti method HTTP: Route::get, post, put, patch, delete, dan options. Untuk beberapa method sekaligus pakai Route::match(['get', 'post'], '/url', ...), atau Route::any untuk semua method.

Form yang mengirim ke route POST, PUT, PATCH, atau DELETE di web.php wajib menyertakan @csrf. Tanpa itu, Laravel menolak request dengan status 419 Page Expired.

Route untuk view dan redirect

Kalau sebuah URL hanya menampilkan view atau mengalihkan ke URL lain, tidak perlu closure:

Route::view('/tentang-kami', 'about');
Route::redirect('/blog', '/artikel-baru', 301);

Tanpa argumen ketiga, Route::redirect memakai status 302. Untuk pindah alamat permanen, pakai 301 atau Route::permanentRedirect.

Parameter Route

Bagian URL yang berubah-ubah ditulis di dalam kurung kurawal dan diterima sebagai argumen fungsi:

Route::get('/user/{id}', function (string $id) {
    return "User {$id}";
})->whereNumber('id');

whereNumber membatasi parameter hanya angka. Akses /user/abc akan menghasilkan 404, bukan error di kode kamu. Ada juga whereAlpha, whereAlphaNumeric, whereUuid, dan where dengan regex bebas:

Route::get('/artikel/{slug}', function (string $slug) {
    return $slug;
})->where('slug', '[a-z0-9-]+');

Parameter opsional

Beri tanda tanya pada parameter dan nilai default pada argumen fungsinya:

Route::get('/cari/{kata?}', function (?string $kata = null) {
    return $kata ? "Mencari: {$kata}" : 'Masukkan kata kunci';
});

Tanpa nilai default = null, akses /cari akan error karena argumennya kosong.

Named Route

Named route memberi nama pada route, sehingga link di view tidak perlu menulis URL secara manual:

Route::get('/profil/saya', function () {
    return view('profile');
})->name('profil');

Pakai nama itu di Blade atau controller:

<a href="{{ route('profil') }}">Profil saya</a>

// di controller
return redirect()->route('profil');

Untuk route berparameter, kirim nilainya sebagai argumen kedua: route('orders.show', ['id' => 7]) atau cukup route('orders.show', 7), hasilnya /orders/7. Keuntungannya, kalau suatu saat URL diubah, semua link ikut berubah tanpa mencari satu per satu.

Route Group: Prefix, Name, dan Middleware

Route yang berbagi awalan URL, awalan nama, atau middleware bisa dikelompokkan:

Route::prefix('admin')
    ->name('admin.')
    ->middleware('auth')
    ->group(function () {
        Route::get('/dashboard', fn () => view('admin.dashboard'))->name('dashboard');
        Route::get('/laporan', fn () => view('admin.laporan'))->name('laporan');
    });

Hasilnya route /admin/dashboard bernama admin.dashboard, dan keduanya hanya bisa diakses pengguna yang sudah login. Pengunjung yang belum login dialihkan ke route bernama login, atau mendapat 401 untuk request JSON. Pastikan route login memang ada (starter kit sudah menyediakannya). Kalau belum ada, muncul error Route [login] not defined.

Route ke Controller

Untuk aplikasi nyata, logika sebaiknya dipindah dari closure ke controller:

use App\Http\Controllers\OrderController;

Route::get('/orders', [OrderController::class, 'index'])->name('orders.index');

Kalau banyak route memakai controller yang sama, gunakan Route::controller supaya tidak menulis nama class berulang kali:

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders', 'index')->name('orders.index');
    Route::get('/orders/{id}', 'show')->whereNumber('id')->name('orders.show');
});

Untuk CRUD lengkap, satu baris Route::resource('products', ProductController::class) langsung membuat tujuh route. Detailnya, termasuk resource controller, API controller, dan controller satu aksi, ada di panduan membuat controller di Laravel 12.

Route Model Binding

Kalau argumen fungsi diberi type-hint model Eloquent dan namanya sama dengan parameter route, Laravel otomatis mengambil data dari database. Kalau data tidak ada, hasilnya 404:

use App\Models\Category;

Route::get('/kategori/{category:slug}', function (Category $category) {
    return $category->name;
});

Bagian :slug membuat Laravel mencari berdasarkan kolom slug, bukan id. Jadi /kategori/kopi-robusta langsung mengembalikan kategori dengan slug tersebut. Tanpa :slug, pencarian memakai primary key. Pastikan nama parameter ({category}) sama dengan nama variabel ($category). Kalau berbeda, binding tidak berjalan dan kamu mendapat model kosong.

Fallback Route

Fallback route dijalankan ketika tidak ada route lain yang cocok. Taruh di baris paling akhir file route:

Route::fallback(function () {
    return response('Halaman tidak ditemukan', 404);
});

Kalau ingin tampilan khusus, ganti dengan response()->view('nama-view', [], 404). Fallback hanya menangkap request GET yang tidak cocok dengan route mana pun, dan juga terpanggil saat batasan seperti whereNumber tidak terpenuhi.

Mengecek dan Men-cache Route

# semua route milik aplikasi (tanpa route bawaan paket)
php artisan route:list --except-vendor

# filter berdasarkan nama atau path
php artisan route:list --name=admin
php artisan route:list --path=orders

# production: cache route agar registrasi lebih cepat
php artisan route:cache
php artisan route:clear

Setelah route:cache, perubahan di file route tidak terbaca sampai kamu menjalankan route:clear atau route:cache lagi. Ini penyebab umum “route baru tidak muncul” di server. Perintah Artisan lain yang sering dipakai ada di artikel apa itu PHP Artisan.

Error Routing yang Sering Muncul

  • 404 padahal route sudah ditulis. Cek urutan: route spesifik seperti /products/export harus ditulis sebelum route berparameter /products/{product}. Cek juga apakah route sedang di-cache.
  • 405 Method Not Allowed. URL-nya benar tetapi method-nya salah, misalnya form mengirim POST ke route yang hanya Route::put. Tambahkan @method('PUT') di form.
  • 419 Page Expired. Form tidak menyertakan @csrf, atau session sudah kedaluwarsa.
  • Route [nama] not defined. Nama di route('...') salah ketik, atau route-nya belum diberi ->name(). Cek dengan php artisan route:list --name=nama.
  • Target class [XController] does not exist. Baris use App\Http\Controllers\XController; belum ditulis di file route.

Pertanyaan yang Sering Diajukan

Apa bedanya routes/web.php dan routes/api.php?

web.php untuk halaman yang dibuka di browser, dengan session dan proteksi CSRF. api.php untuk API yang stateless, biasanya diautentikasi dengan token, dan semua URL-nya otomatis berawalan /api. Di Laravel 12, api.php baru ada setelah menjalankan php artisan install:api.

Apa saja jenis routing di Laravel?

Yang paling sering dipakai: route dasar dengan closure, route ke controller, resource route untuk CRUD, route dengan parameter, named route, route group, dan fallback route. Semuanya dibahas di atas.

Lebih baik pakai closure atau controller?

Closure praktis untuk percobaan atau halaman sangat sederhana. Untuk aplikasi yang akan dirawat, controller lebih rapi karena logika terkumpul per fitur dan file route tetap pendek.

Kenapa route baru tidak muncul di server production?

Kemungkinan besar route sedang di-cache. Jalankan php artisan route:clear, atau php artisan optimize:clear untuk menghapus semua cache sekaligus.

Setelah route, langkah berikutnya biasanya menyiapkan tabel database lewat migration Laravel, lalu menghubungkannya ke controller.

Sedang membangun aplikasi bisnis dengan Laravel dan butuh tim yang mengerjakannya sampai production? Tim Arrazy Inovasi di Purwokerto mengerjakan pembuatan sistem aplikasi custom, termasuk dengan stack Laravel.

Diskusikan project Laravel kamu →

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *