Роутинг фреймворка Laravel: от простых маршрутов к контроллерам

Раздел: Laravel -> Маршрутизация и контроллеры в Laravel

Основы роутинга в Laravel

Роутинг (маршрутизация) в Laravel связывает входящие HTTP запросы с обработчиками. Маршруты определяются в файле routes/web.php для веб интерфейса и routes/api.php для API. Основным инструментом является фасад Route, предоставляющий методы для каждого HTTP метода.

Наиболее распространённый способ - использование статических методов фасада Route для указания URL и действия.

Route::get('/home', function () {
    return 'Главная страница';
});

Laravel route php (роутинг в laravel php)

Методы Route::get, post, put, patch, delete соответствуют HTTP методам. Если запрос приходит с методом, не совпадающим с маршрутом, возвращается ошибка 405 Method Not Allowed.

Типичная ошибка: Использование метода post в форме, но маршрут определён как get. Решение: изменить метод в форме или определить маршрут для post.

Как передать обязательный параметр в URL?

Route::get('/user/{id}', function ($id) {
    return 'Пользователь с ID: ' . $id;
});

Фигурные скобки обозначают сегмент, значение которого передаётся в замыкание. Параметр может быть опциональным при добавлении знака вопроса: {name?}.

Проблема: Если обязательный параметр отсутствует, возвращается 404. Для опциональных параметров нужно указывать значение по умолчанию в замыкании. Также полезно ограничивать формат параметра с помощью where: ->where('id', '[0-9]+').

Как присвоить маршруту имя для удобной генерации URL?

Route::get('/profile', function () {
    return 'Профиль';
})->name('profile');

Имя задаётся цепочкой name(). Затем генерировать URL можно с помощью хелпера route('profile'). Имя должно быть уникальным.

Ошибка: Дублирование имени переопределяет предыдущий маршрут. Рекомендуется использовать префиксы в именах, например user.profile.

Как сгруппировать маршруты с общим префиксом или middleware?

Route::prefix('admin')->group(function () {
    Route::get('/', function () { return 'Admin'; });
    Route::get('/users', function () { return 'Users'; });
});

Метод prefix добавляет общий сегмент URL. Можно комбинировать с middleware, namespace, name.

Проблема: Если middleware не существует, Laravel выбрасывает исключение. Также вложенные группы могут привести к неожиданным префиксам, если порядок неправильный.

Как создать стандартные CRUD маршруты для модели одним вызовом?

Route::resource('photos', PhotoController::class);

Генерирует 7 маршрутов: index, create, store, show, edit, update, destroy. Можно ограничить методами: ->only(['index', 'show']) или исключить ->except(['destroy']).

Ошибка: Если контроллер не содержит соответствующих методов, при обращении к маршруту возникнет исключение 500. Необходимо убедиться, что контроллер наследует Controller и содержит нужные методы.

Как обработать все неопределённые маршруты?

Route::fallback(function () {
    return '404 страница не найдена';
});

Route::fallback должен быть последним в файле. Он перехватывает любые запросы, не соответствующие ни одному маршруту.

Проблема: Если fallback определён до других маршрутов, он может перехватывать и существующие, возвращая 404. Всегда размещайте fallback в конце.

Как сделать простое перенаправление с одного пути на другой?

Route::redirect('/old', '/new', 301);

Метод redirect создаёт маршрут, который сразу перенаправляет на новый путь. Третий аргумент - HTTP статус (301 для постоянного, 302 для временного).

Ошибка: Рекурсивное перенаправление, если пути совпадают. Например, '/a' => '/a' вызовет бесконечный цикл. Проверяйте целевой URL.

Как автоматически извлекать модель Eloquent по идентификатору из URL?

Route::get('/user/{user}', function (User $user) {
    return $user->name;
});

Неявная привязка модели: если имя параметра совпадает с именем модели (в snake_case), Laravel автоматически загружает модель по первичному ключу. При отсутствии - 404.

Типичные сложности: Имя параметра должно совпадать с именем модели в единственном числе (например, {user} для User). Для кастомного ключа применяется явная привязка через Route::bind или Route::model.

Продвинутые примеры маршрутизации

Ниже приведены расширенные сценарии использования роутинга в Laravel с подробными пояснениями.

Пример 1: Маршрут для отображения вида без контроллера

Пример
Route::view('/welcome', 'welcome', ['name' => 'Laravel']);

Результат: при переходе на /welcome отобразится содержимое шаблона welcome.blade.php с переданной переменной $name равной 'Laravel'.

Пример 2: Ограничение параметров регулярными выражениями

Пример
Route::get('/user/{name}/{age}', function ($name, $age) {
    return "$name is $age years old";
})->where(['name' => '[a-zA-Z]+', 'age' => '[0-9]+']);

Результат: маршрут совпадёт только если {name} содержит буквы, а {age} только цифры. Иначе - 404.

Пример 3: Именованные группы с вложенными префиксами

Пример
Route::prefix('admin')->name('admin.')->group(function () {
    Route::get('/dashboard', function () {})->name('dashboard');
});

Результат: хелпер route('admin.dashboard') сгенерирует URL /admin/dashboard. Имена маршрутов внутри группы получают префикс 'admin.'.

Пример 4: Вложенные ресурсные маршруты

Пример
Route::resource('posts.comments', PostCommentController::class);

Результат: создаются маршруты для вложенного ресурса, например /posts/{post}/comments/{comment}. Контроллер получает два параметра: $post и $comment.

Пример 5: Явная привязка модели с кастомным ключом

Пример
Route::bind('post', function ($value) {
    return Post::where('slug', $value)->firstOrFail();
});
Route::get('/post/{post}', function (Post $post) {
    return $post->title;
});

Результат: URL вида /post/my-article-slug загрузит модель Post по полю slug. Если модель не найдена, выброшено исключение 404.

Пример 6: Кэширование маршрутов

Пример
php artisan route:cache

Результат: создаётся закэшированный файл bootstrap/cache/routes.php, ускоряющий загрузку маршрутов. После добавления новых маршрутов необходимо повторно выполнить route:cache. Отмена кэша: php artisan route:clear.

Route cache cleared!
Routes cached successfully!

Пример 7: Fallback маршрут с middleware

Пример
Route::fallback(function () {
    return response()->view('errors.404', [], 404);
})->middleware('web');

Результат: любые запросы, не совпадающие с другими маршрутами, будут обработаны этим замыканием с применением middleware 'web'. Возвращается HTTP статус 404.

Пример 8: Глобальное ограничение параметров с помощью pattern

Пример
Route::pattern('id', '[0-9]+');
Route::get('/user/{id}', function ($id) { ... });
Route::get('/post/{id}', function ($id) { ... });

Результат: все маршруты, использующие параметр с именем id, будут автоматически проверять его на соответствие регулярному выражению [0-9]+.

Пример 9: Группа с массивом middleware

Пример
Route::middleware(['auth', 'verified'])->group(function () {
    Route::get('/dashboard', function () { return 'Dashboard'; });
    Route::get('/settings', function () { return 'Settings'; });
});

Результат: оба маршрута защищены middleware auth и verified. Доступ только для аутентифицированных и подтверждённых пользователей.

Роутинг в Laravel PHP - comments

En
Laravel route php (php)