Урок 03

Параметры роутов

Параметры позволяют передавать данные через URL. Они объявляются в фигурных скобках и попадают в аргументы обработчика.

Обязательный параметр

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

Если открыть /user/42, в $id попадёт 42.

Несколько параметров

Route::get('/posts/{post}/comments/{comment}', function ($postId, $commentId) {
    return "Post {$postId}, Comment {$commentId}";
});

Порядок параметров в URL и в аргументах функции должен совпадать.

Необязательный параметр

Помечается ?. В функции должно быть значение по умолчанию:

Route::get('/user/{name?}', function (string $name = 'Guest') {
    return "Hello, {$name}";
});

Если открыть /user — вернёт Hello, Guest. Если /user/Alice — Hello, Alice.

Ограничения через регулярные выражения

Метод where задаёт шаблон, которому должен соответствовать параметр:

Route::get('/user/{id}', function ($id) {
    return $id;
})->where('id', '[0-9]+');

Если URL /user/abc — вернётся 404.

Несколько ограничений:

Route::get('/user/{id}/{slug}', function ($id, $slug) {
    //
})->where(['id' => '[0-9]+', 'slug' => '[a-z-]+']);

Глобальные паттерны

Если один и тот же паттерн нужен везде, его можно задать глобально в AppServiceProvider:

use Illuminate\Support\Facades\Route;

public function boot(): void
{
    Route::pattern('id', '[0-9]+');
}

Теперь любой {id} в любом роуте будет соответствовать только цифрам.

Именованные параметры

Имя параметра в URL и в аргументе должны совпадать. Laravel подставляет значения по имени, а не по порядку:

Route::get('/users/{userId}/posts/{postId}', function ($userId, $postId) {
    //
});