Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Маршруты

Маршрут связывает адрес и HTTP-метод с кодом, который формирует ответ. Маршруты веб-страниц описываются в файле routes/web.php.

Простой маршрут

use Illuminate\Support\Facades\Route;
 
Route::get('/hello', function () {
    return 'Привет!';
});

Теперь по адресу /hello сайт вернёт строку «Привет!».

HTTP-методы

У каждого метода запроса свой метод маршрута. Один адрес может по-разному отвечать на разные методы:

Route::get('/posts', fn () => 'Список статей');
Route::post('/posts', fn () => 'Статья создана');
Route::put('/posts/{id}', fn (string $id) => "Статья $id изменена");
Route::delete('/posts/{id}', fn (string $id) => "Статья $id удалена");

GET используют для чтения страниц, остальные — для изменения данных.

Параметры

Часть адреса в фигурных скобках попадает в аргумент функции:

Route::get('/users/{id}', function (string $id) {
    return "Пользователь $id";
});

Необязательный параметр помечается знаком вопроса и получает значение по умолчанию:

Route::get('/posts/{page?}', function (int $page = 1) {
    return "Страница $page";
});

Ограничения параметров

Чтобы маршрут срабатывал только для подходящих значений, параметру задают правило:

Route::get('/users/{id}', function (string $id) {
    return "Пользователь $id";
})->whereNumber('id');

Адрес /users/15 подойдёт, а /users/anna вернёт ошибку 404.

Именованные маршруты

Имя позволяет ссылаться на маршрут, не повторяя адрес:

Route::get('/profile', fn () => 'Профиль')->name('profile');
 
$url = route('profile'); // http://localhost:8000/profile

Если адрес изменится, ссылки по имени продолжат работать.

Группы

Общую часть адреса выносят в группу:

Route::prefix('admin')->group(function () {
    Route::get('/users', fn () => 'Пользователи'); // /admin/users
    Route::get('/posts', fn () => 'Статьи');       // /admin/posts
});

Список всех маршрутов проекта показывает команда php artisan route:list.

Частая ошибка

Laravel проверяет маршруты сверху вниз и берёт первый подходящий. Маршрут с параметром, стоящий выше, перехватит и конкретный адрес:

// Неправильно: /posts/create попадёт в первый маршрут как id = "create".
Route::get('/posts/{id}', fn (string $id) => "Статья $id");
Route::get('/posts/create', fn () => 'Новая статья');

Ставьте конкретные адреса выше маршрутов с параметрами.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.