Laravel 13.x — Routing

File-file route terletak di folder routes.

General

Metode route yang tersedia

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Menggunakan beberapa method sekaligus:

Route::match(['get', 'post'], '/', function () {
    // ...
});
 
Route::any('/', function () {
    // ...
});
Urutan pendefinisian

Saat mendefinisikan beberapa route dengan URI yang sama, route yang menggunakan metode get, post, put, patch, delete, dan options harus didefinisikan sebelum route yang menggunakan metode any, match, dan redirect.

Menyertakan dependency

use Illuminate\Http\Request;
 
Route::get('/users', function (Request $request) {
    // ...
});

Web route

Route ke function

use Illuminate\Support\Facades\Route;
 
Route::get('/greeting', function () {
    return 'Hello World';
});

Route ke controller function

use App\Http\Controllers\UserController;
 
Route::get('/user', [UserController::class, 'index']);

Route ke controller function dengan middleware

Route::get('/profile', [UserController::class, 'show'])->middleware('auth');

Route ke view

Route::view('/welcome', 'welcome');
 
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

Redirect ke route lain

Route::redirect('/here', '/there');           // Default status code 302

Route::redirect('/here', '/there', 301);
Route::permanentRedirect('/here', '/there');  // Status code 301
Perlindungan CSRF

Tambahkan @csrf di form:

<form method="POST" action="/profile">
  @csrf
  ...
</form>

API route

Isi default routes/api.php:

Route::get('/user', function (Request $request) {
    return $request->user();
})->middleware('auth:sanctum');

Prefix /api secara otomatis ditambahkan ke route.

Prefix ini bisa diganti dengan memodifikasi file bootstrap/app.php:

->withRouting(
    api: __DIR__.'/../routes/api.php',
    apiPrefix: 'api/admin',
    // ...
)

Route parameter

Parameter wajib

Route parameters selalu dibungkus di dalam kurung kurawal {} dan harus terdiri dari karakter alfabet atau _ (underscore).

Route::get('/user/{id}', function (string $id) {
    return 'User '.$id;
});

Route::get('/posts/{post}/comments/{comment}', function (string $postId, string $commentId) {
    // ...
});

Nilai parameter akan disuntikkan ke dalam callback route / controller berdasarkan urutannya.

Parameter opsional

Route::get('/user/{name?}', function (?string $name = null) {
    return $name;
});
 
Route::get('/user/{name?}', function (?string $name = 'John') {
    return $name;
});

Regular expression constraint

Jika nilai parameter tidak cocok dengan constraint yang ditetapkan untuk semua route yang sesuai, respons HTTP 404 akan dikembalikan.

Route::get('/user/{name}', function (string $name) {
    // ...
})->where('name', '[A-Za-z]+');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->where('id', '[0-9]+');
 
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Route::get('/user/{id}/{name}', function (string $id, string $name) {
    // ...
})->whereNumber('id')->whereAlpha('name');
 
Route::get('/user/{name}', function (string $name) {
    // ...
})->whereAlphaNumeric('name');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUuid('id');
 
Route::get('/user/{id}', function (string $id) {
    // ...
})->whereUlid('id');
 
Route::get('/category/{category}', function (string $category) {
    // ...
})->whereIn('category', ['movie', 'song', 'painting']);

Global constraint

use Illuminate\Support\Facades\Route;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

Contoh constraint di atas akan diterapkan pada semua parameter dengan nama id.

Route::get('/user/{id}', function (string $id) {
    // Hanya dieksekusi jika {id} adalah numerik...
});

Mengizinkan / masuk nilai parameter

Kecuali karakter / harus diizinkan secara eksplisit, dan hanya diperbolehkan pada segmen terakhir URL.

Route::get('/search/{search}', function (string $search) {
    return $search;
})->where('search', '.*');

Menyertakan dependency

use Illuminate\Http\Request;
 
Route::get('/user/{id}', function (Request $request, string $id) {
    return 'User '.$id;
});

Customize route

Route aplikasi dikonfigurasi dan dimuat oleh file bootstrap/app.php:

<?php
 
use Illuminate\Foundation\Application;
 
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )->create();

Kalau mau menambahkan file route custom, tambahkan dengan menggunakan closure then:

use Illuminate\Support\Facades\Route;
 
->withRouting(
    web: __DIR__.'/../routes/web.php',
    commands: __DIR__.'/../routes/console.php',
    health: '/up',
    then: function () {
        Route::middleware('api')
            ->prefix('webhooks')
            ->name('webhooks.')
            ->group(base_path('routes/webhooks.php'));
    },
)

Kalau mau ambil alih kendali penuh registrasi route, gunakan closure using:

use Illuminate\Support\Facades\Route;
 
->withRouting(
    commands: __DIR__.'/../routes/console.php',
    using: function () {
        Route::middleware('api')
            ->prefix('api')
            ->group(base_path('routes/api.php'));
 
        Route::middleware('web')
            ->group(base_path('routes/web.php'));
    },
)

Perintah PHP Artisan

Membuat API Route

php artisan install:api

Menampilkan list route

php artisan route:list

php artisan route:list -v     # Disertai list middleware
php artisan route:list -vv    # Lebih detail

# Hanya tampilkan route yang dimulai dengan api
php artisan route:list --path=api

# Sembunyikan route dari package pihak ketiga
php artisan route:list --except-vendor

# Hanya tampilkan route dari package pihak ketiga
php artisan route:list --only-vendor