LaravelRoutingDasarPemula4 mnt baca

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

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:

php
// 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:

php
// 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/posts

Route 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:

php
// 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).

php
// 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).
php
// BENAR: aksi destruktif pakai DELETE lewat form
Route::delete('/post/{id}', [PostController::class, 'destroy']);
// Di Blade: form POST + @method('DELETE') + @csrf

Salah: lupa @csrf di form POST lalu bingung kenapa error 419.

php
// SALAH: form tanpa token CSRF
// <form method="POST" action="/komentar"> ... </form>
// Hasil: error 419 "Page Expired"
blade
{{-- 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.