Setiap kali browser membuka sebuah halaman di aplikasi kita, browser mengirimkan dua informasi kunci: path URL yang dituju dan HTTP method yang dipakai. Router adalah komponen Laravel yang bertugas mencocokkan pasangan kedua informasi tersebut dengan potongan kode yang harus menjawabnya. Kita bisa menganggap router sebagai resepsionis aplikasi: request datang, resepsionis memeriksa daftar route, lalu meneruskan request ke “meja” yang tepat. Chapter ini membahas konsep pencocokan tersebut, lokasi definisi route di struktur proyek, dan alur kerja router sebelum kita menulis banyak route di chapter berikutnya.

Router Mencocokkan URL dan HTTP Method #

Sebuah route adalah aturan pencocokan yang terdiri dari tiga bagian: HTTP method, pola URI, dan handler (kode yang dijalankan saat cocok). Pencocokan selalu mempertimbangkan method dan URI sekaligus, bukan salah satunya. Request GET /tugas dan POST /tugas adalah dua request yang berbeda dan boleh diarahkan ke dua handler berbeda — pola yang menjadi fondasi REST API. Handler sendiri bisa berupa closure (fungsi anonim) maupun method di sebuah controller, dan tugas handler adalah menghasilkan response yang dikirim kembali ke browser.

Di Mana Route Didefinisikan #

Pada struktur proyek Laravel 13, definisi route HTTP kita tulis di routes/web.php, sedangkan perintah Artisan berbasis closure ditulis di routes/console.php. Kedua berkas tersebut didaftarkan ke aplikasi lewat withRouting() di bootstrap/app.php:

php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    // ... withMiddleware() dan withExceptions()
    ->create();

Aplikasi segar hanya memuat dua berkas route tersebut. Ketika kita kelak membangun API, kita bisa mendaftarkan berkas tambahan seperti routes/api.php pada argumen api: — Laravel tetap mengaturnya dari satu tempat yang sama. Perhatikan juga argumen health: '/up': Laravel otomatis menyediakan route health check di URI /up, yang sering dipakai load balancer untuk memeriksa status aplikasi.

Alur Kerja Router #

Rangkaian berikut menunjukkan posisi router di dalam perjalanan satu request, mulai dari browser sampai response kembali. Kita sudah membedah alur lengkapnya di chapter Lifecycle Request Laravel ; diagram ini memfokuskan pada keputusan pencocokan yang dibuat router.

Dua cabang kegagalan pada diagram penting dipahami. Ketika tidak ada satu pun route yang cocok, router melempar NotFoundHttpException yang menjadi halaman error 404. Ketika URI ada tetapi HTTP method-nya berbeda — misalnya route hanya terdaftar untuk GET padahal request datang sebagai POST — Laravel menjawab 405 Method Not Allowed. Artinya, melihat URL saja belum cukup untuk menentukan route mana yang berjalan.

Route Pertama Kita #

Mari kita buktikan perilaku pencocokan di atas dengan satu route sungguhan. Ganti isi routes/web.php dengan kode berikut:

php
<?php

use Illuminate\Support\Facades\Route;

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

Method Route::get() mendaftarkan route untuk method GET pada URI /halo, dan closure-nya mengembalikan string sebagai response. Setelah berkas disimpan, perintah route:list menampilkan route yang barusan terdaftar:

bash
php artisan route:list --except-vendor

Output yang Dihasilkan:

text
  GET|HEAD       halo ........................................................... routes/web.php:5

                                                                                Showing [1] routes

Flag --except-vendor menyembunyikan route bawaan paket vendor seperti sanctum/csrf-cookie agar daftarnya fokus pada route milik kita. Selanjutnya, kita uji ketiga skenario pencocokan dengan skrip kecil yang meniru request browser — pola yang sama dengan chapter Lifecycle Request Laravel :

php
<?php

// uji-route.php — jalankan dari root proyek Laravel
use Illuminate\Contracts\Http\Kernel;
use Illuminate\Http\Request;

require __DIR__.'/vendor/autoload.php';
$app = require __DIR__.'/bootstrap/app.php';

$kernel = $app->make(Kernel::class);

$permintaan = [
    ['GET', '/halo'],
    ['GET', '/halo-dunia'],
    ['POST', '/halo'],
];

foreach ($permintaan as [$method, $uri]) {
    $response = $kernel->handle(
        Request::create('http://localhost:8000'.$uri, $method)
    );
    echo str_pad("{$method} {$uri}", 22)
        ." → HTTP ".$response->getStatusCode().PHP_EOL;
}

Output yang Dihasilkan:

text
GET /halo              → HTTP 200
GET /halo-dunia        → HTTP 404
POST /halo             → HTTP 405

Tiga baris output tersebut meringkas pekerjaan router: request GET /halo cocok dengan route kita dan menghasilkan response 200 berisi teks Halo, Laravel!. Request GET /halo-dunia tidak cocok dengan route mana pun sehingga dijawab 404, dan request POST /halo menabrak route yang benar URI-nya tetapi salah method-nya sehingga dijawab 405. Detail lengkap seluruh kemampuan router tersedia di dokumentasi routing .

Sekarang konsepnya jelas: satu route = satu pasangan method dan URI yang menunjuk satu handler. Chapter berikutnya, Route Dasar , membahas seluruh HTTP method yang didukung beserta shortcut untuk view, redirect, dan route fallback.