Routing adalah pintu masuk semua request di Laravel. Sebelum request sampai ke controller atau logika apapun, dia harus melewati router dulu. Memahami cara kerja routing akan membuat kamu lebih mudah membangun struktur aplikasi yang rapi dan mudah di-maintain.
Konsep Dasar: Bagaimana Request Diproses
Saat browser mengirim request ke GET /posts, Laravel membaca file routes/web.php, mencari route yang cocok, lalu meneruskan ke handler yang ditentukan. Urutan ini tidak bisa dibalik.
Bentuk route paling sederhana:
// routes/web.php
Route::get('/posts', function () {
return 'Daftar semua post';
});
// Atau langsung ke controller
Route::get('/posts', [PostController::class, 'index']);
HTTP Method yang Tersedia
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::put('/posts/{id}', [PostController::class, 'update']);
Route::patch('/posts/{id}', [PostController::class, 'update']);
Route::delete('/posts/{id}', [PostController::class, 'destroy']);
Kalau mau handle lebih dari satu method sekaligus:
Route::match(['get', 'post'], '/form', [FormController::class, 'handle']);
Route::any('/webhook', [WebhookController::class, 'receive']);
Route Parameter
Parameter wajib — request harus menyertakan nilai ini:
Route::get('/users/{id}', function (string $id) {
return "User ID: $id";
});
// Bisa langsung inject model (Route Model Binding)
Route::get('/users/{user}', function (User $user) {
return $user; // otomatis cari User::find($id)
});
Parameter opsional — tambahkan ? dan nilai default:
Route::get('/posts/{slug?}', function (string $slug = 'semua') {
return "Slug: $slug";
});
Tambahkan constraint untuk validasi parameter:
Route::get('/users/{id}', [UserController::class, 'show'])
->where('id', '[0-9]+'); // hanya menerima angka
Route::get('/posts/{slug}', [PostController::class, 'show'])
->where('slug', '[a-z0-9-]+');
Named Route
Named route memudahkan generate URL di dalam kode, tidak perlu hardcode string URL:
Route::get('/posts/{id}', [PostController::class, 'show'])
->name('posts.show');
// Generate URL dari nama
$url = route('posts.show', ['id' => 5]);
// Hasil: http://app.test/posts/5
// Redirect ke named route
return redirect()->route('posts.show', ['id' => 5]);
Route Group
Grup route berguna untuk menerapkan prefix, middleware, atau namespace secara serentak:
// Grup dengan prefix URL
Route::prefix('admin')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
// Accessible di: /admin/dashboard, /admin/users
});
// Grup dengan middleware
Route::middleware(['auth'])->group(function () {
Route::get('/profile', [ProfileController::class, 'show']);
Route::get('/settings', [SettingController::class, 'index']);
});
// Kombinasi keduanya
Route::middleware(['auth'])->prefix('dashboard')->group(function () {
Route::get('/overview', [DashboardController::class, 'overview']);
});
Resource Route
Satu baris untuk membuat 7 route CRUD sekaligus:
Route::resource('posts', PostController::class);
Ini setara dengan:
GET /posts → index
GET /posts/create → create
POST /posts → store
GET /posts/{post} → show
GET /posts/{post}/edit → edit
PUT /posts/{post} → update
DELETE /posts/{post} → destroy
Kalau tidak butuh semua route:
// Hanya route tertentu
Route::resource('posts', PostController::class)
->only(['index', 'show']);
// Kecualikan route tertentu
Route::resource('posts', PostController::class)
->except(['create', 'edit']);
Melihat Semua Route yang Terdaftar
php artisan route:list
# Filter berdasarkan nama
php artisan route:list --name=posts
# Filter berdasarkan method
php artisan route:list --method=GET
Route Caching untuk Production
Di production, cache route agar lebih cepat:
php artisan route:cache
# Hapus cache (jalankan setelah ubah routes/)
php artisan route:clear
Baca juga: Membuat Controller di Laravel 12 dan Invokable Controller di Laravel.
Kalau kamu butuh tim untuk membangun aplikasi Laravel dari arsitektur awal sampai deployment, lihat layanan pengembangan aplikasi kami.

Leave a Reply