Routing Dasar: Menghubungkan URL ke Kode
Definisikan route GET/POST di web.php dan pahami cara Laravel mencocokkan URL.
Analogi: Resepsionis Hotel
Setiap tamu yang datang ke hotel melewati resepsionis dulu. Tamu menyebut nomor kamar ("saya mau ke /tentang"), resepsionis mengecek buku tamu, lalu mengarahkan ke kamar yang benar. Tanpa resepsionis, tamu berkeliaran sendiri membuka pintu acak.
Route adalah resepsionis aplikasimu. Setiap request HTTP yang masuk dicek: method-nya apa (GET/POST), URL-nya apa, lalu diteruskan ke kode yang tepat. File routes/web.php adalah buku tamu tempat semua aturan itu ditulis.
Kenapa Routing Terpusat? Masalah Apa yang Diselesaikan?
Di PHP murni, satu URL sama dengan satu file: /tentang berarti harus ada file tentang.php. Mau URL cantik seperti /artikel/cara-menanam-cabai? Kamu butuh file per artikel atau konfigurasi .htaccess yang rumit. Mau membedakan GET dan POST di URL yang sama? Tulis if manual di setiap file.
Routing terpusat menyelesaikan tiga hal: URL bebas (tidak harus sama dengan nama file), pembedaan method HTTP (GET untuk membaca, POST untuk mengirim, di URL yang sama), dan satu tempat melihat semua URL aplikasi (php artisan route:list). Mengubah URL tidak berarti me-rename file.
Contoh 1: Route Dasar di web.php
// routes/web.php
use Illuminate\Support\Facades\Route;
// GET: menampilkan halaman (membaca, tidak mengubah data)
Route::get('/', function () {
return view('welcome');
});
Route::get('/tentang', function () {
return 'Halaman tentang kami';
});
// POST: menerima kiriman data (mengubah sesuatu di server)
Route::post('/komentar', function () {
// simpan komentar ke database...
return redirect('/artikel');
});Aturan mainnya: GET untuk mengambil/menampilkan, POST (PUT, PATCH, DELETE) untuk mengubah. Ini konvensi HTTP, bukan aturan Laravel, tapi Laravel menegakkannya dengan rapi.
Contoh 2: Route Menunjuk ke Controller + Route API
Closure cocok untuk contoh, tapi route serius menunjuk ke controller:
// routes/web.php
use App\Http\Controllers\PageController;
use App\Http\Controllers\KomentarController;
Route::get('/tentang', [PageController::class, 'tentang']);
Route::post('/komentar', [KomentarController::class, 'store']);Dan untuk API (backend aplikasi mobile/SPA), pakai file terpisah:
// routes/api.php: otomatis dapat prefix /api
use App\Http\Controllers\Api\PostController;
Route::get('/posts', [PostController::class, 'index']);
// URL jadinya: http://localhost:8000/api/postsRoute di api.php otomatis berprefix /api dan memakai middleware API (tanpa session, biasanya pakai token). Memisahkan web.php dan api.php membuat aplikasi web dan API bisa hidup berdampingan dengan rapi.
Untuk route super sederhana, ada jalan pintas tanpa closure:
// routes/web.php
// Langsung tampilkan view tanpa controller/closure
Route::view('/promo', 'promo');
// Redirect permanen satu baris, tanpa controller
Route::redirect('/lama', '/baru', 301);Route::view cocok untuk halaman statis (syarat, ketentuan, promo), Route::redirect untuk URL lama yang pindah alamat. Keduanya tetap bisa diberi ->name() seperti route biasa.
Catatan teknis: Route dicocokkan dari atas ke bawah, yang pertama cocok menang. Karena itu route yang lebih spesifik harus ditulis SEBELUM route wildcard:
php// BENAR: yang spesifik dulu Route::get('/post/baru', ...); Route::get('/post/{id}', ...); // SALAH: /post/baru tidak akan pernah tercapai, // karena {id} sudah menangkap kata "baru" duluan
Kesalahan Umum Pemula
Salah: memakai GET untuk aksi yang mengubah data (misal hapus lewat link).
// SALAH: link hapus pakai GET: bahaya!
Route::get('/post/{id}/hapus', [PostController::class, 'destroy']);
// Masalah: browser/crawler bisa "mengklik" URL ini tanpa sengaja,
// dan data terhapus. GET harus aman diulang-ulang (idempotent).// BENAR: aksi destruktif pakai DELETE lewat form
Route::delete('/post/{id}', [PostController::class, 'destroy']);
// Di Blade: form POST + @method('DELETE') + @csrfSalah: lupa @csrf di form POST lalu bingung kenapa error 419.
// SALAH: form tanpa token CSRF
// <form method="POST" action="/komentar"> ... </form>
// Hasil: error 419 "Page Expired"{{-- BENAR: selalu sertakan @csrf di form POST/PUT/DELETE --}}
<form method="POST" action="/komentar">
@csrf
<input name="isi">
</form>Error 419 hampir selalu berarti token CSRF hilang. Laravel melindungimu dari serangan CSRF secara default, dan @csrf adalah kuncinya. Kalau kamu men-disable proteksi ini karena "ribet", kamu membuka lubang keamanan.
Rangkuman
Route adalah resepsionis: ia memetakan method + URL ke kode yang tepat. GET untuk membaca, POST/PUT/DELETE untuk mengubah, dan form POST wajib pakai @csrf. Tulis route spesifik sebelum route wildcard. Berikutnya: bikin URL dinamis dengan route parameter.
Tantangan
Lima Route
Buat 5 route di web.php: / (view welcome), /halo/{nama} (sapa nama), /waktu (tampilkan jam sekarang), POST /sapa (redirect ke /halo/dunia), dan /admin (teks 'rahasia'). Verifikasi dengan route:list.