Маршруты и контроллеры в Laravel: что знать до начала
Первый рабочий маршрут в Laravel 11 занимает пять минут, если знать, где живут файлы и как связать URL с контроллером. Разбираем базовую связку от установки до проверки в браузере.

За полчаса вы поднимете чистый проект на Laravel 11, добавите два маршрута, свяжете их с контроллером и увидите ответ в браузере. Никакой базы данных и Blade-шаблонов — только связка «URL → контроллер → ответ», на которой держится всё остальное. Если раньше вы не запускали Laravel, начните с этого: пока не понятно, как запрос доходит до вашего кода, разбираться в моделях и очередях рано.
Что нужно иметь до начала
Laravel 11 требует PHP 8.2 или новее. Проверьте перед установкой, иначе Composer откажется ставить пакет.
- PHP 8.2+ — команда
php -vдолжна показать версию не ниже 8.2. - Composer — менеджер пакетов PHP, команда
composer --versionдолжна отработать без ошибки. - Расширения PHP: включённые
mbstring,openssl,pdo,ctype,json. В большинстве сборок PHP они уже есть. - Терминал и текстовый редактор — подойдёт любой, VS Code или PhpStorm удобнее из-за подсказок.
Отдельный веб-сервер (Apache, Nginx) на этом этапе не нужен: Laravel запускает встроенный сервер PHP командой php artisan serve.
Шаг 1. Создаём проект
В папке, где будете держать проекты, выполните:
composer create-project laravel/laravel routing-demo
Composer скачает Laravel и зависимости в папку routing-demo. Это займёт одну-три минуты в зависимости от скорости сети.
Проверка: появилась папка routing-demo, внутри — каталоги app, routes, public и файл artisan.
Шаг 2. Запускаем встроенный сервер
Перейдите в папку проекта и стартуйте сервер:
cd routing-demo
php artisan serve
В терминале появится строка вида INFO Server running on [http://127.0.0.1:8000].
Проверка: откройте http://127.0.0.1:8000 в браузере — увидите стартовую страницу Laravel. Терминал не закрывайте, сервер работает, пока он открыт.
Шаг 3. Разбираемся, где живут маршруты
В Laravel 11 структура маршрутов упростилась. Основной файл — routes/web.php. Открыв его, вы увидите один маршрут, который отдаёт стартовую страницу:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('welcome');
});
Метод Route::get() связывает адрес (первый аргумент) с тем, что вернётся при GET-запросе (второй аргумент). Сейчас там анонимная функция — замыкание. Для одной-двух строк это нормально, но логику принято выносить в контроллеры.
Маршрут отвечает на вопрос «какой URL». Контроллер отвечает на вопрос «что делать». Смешивать их в замыканиях удобно ровно до третьего маршрута — дальше файл превращается в свалку.
Добавим простой маршрут-замыкание
Впишите после существующего маршрута:
Route::get('/hello', function () {
return 'Привет из Laravel';
});
Проверка: откройте http://127.0.0.1:8000/hello — на странице будет текст «Привет из Laravel». Если видите 404 — сохраните файл и обновите страницу.
Шаг 4. Создаём контроллер
Контроллер — это класс, куда вы складываете методы-обработчики. Создать его вручную можно, но Artisan делает это одной командой:
php artisan make:controller PageController
Проверка: появился файл app/Http/Controllers/PageController.php с пустым классом.
Откройте его и добавьте метод about:
<?php
namespace App\Http\Controllers;
class PageController extends Controller
{
public function about()
{
return 'Страница о проекте';
}
}
Метод возвращает строку — на этом этапе этого достаточно. Позже вместо строки вы будете возвращать view() или JSON.
Шаг 5. Связываем маршрут с контроллером
Вернитесь в routes/web.php. Подключите класс контроллера и добавьте маршрут, который ссылается на метод:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PageController;
Route::get('/', function () {
return view('welcome');
});
Route::get('/hello', function () {
return 'Привет из Laravel';
});
Route::get('/about', [PageController::class, 'about']);
Синтаксис [PageController::class, 'about'] — это способ указать «класс и его метод». Он рекомендуется в Laravel 11; строковая запись вида 'PageController@about' из старых версий по умолчанию больше не работает без дополнительной настройки.
Проверка: откройте http://127.0.0.1:8000/about — увидите «Страница о проекте». Запрос дошёл до контроллера.
Маршрут с параметром
Часто адрес содержит переменную часть — например, идентификатор. Добавьте метод в контроллер:
public function user(string $id)
{
return 'Пользователь с id ' . $id;
}
И маршрут, где фигурная скобка задаёт параметр:
Route::get('/users/{id}', [PageController::class, 'user']);
Имя в фигурных скобках должно совпадать с именем аргумента метода. Проверка: http://127.0.0.1:8000/users/42 вернёт «Пользователь с id 42».
Как посмотреть все маршруты
Когда маршрутов станет много, держать их в голове не нужно. Artisan покажет список:
php artisan route:list
Команда выведет таблицу: HTTP-метод, URI, к какому контроллеру и методу привязан маршрут. Это первое место, куда стоит смотреть, если маршрут «не находится».
Где web.php, а где api.php
По умолчанию в Laravel 11 есть только routes/web.php. Файл для API-маршрутов не создаётся сам — его подключают отдельной командой.
| Файл | Для чего | Особенность |
|---|---|---|
| routes/web.php | Обычные страницы сайта | Работают сессии и CSRF-защита форм |
| routes/api.php | JSON-API для приложений и фронтенда | Без сессий, префикс /api; подключается командой php artisan install:api |
Пока вы делаете обычные страницы — вам нужен только web.php. API-маршруты — отдельная тема, здесь их не разворачиваем.
Если не получилось
- 404 Not Found на новом маршруте. Файл не сохранён, либо метод HTTP не совпадает:
Route::getотвечает только на GET. Проверьте выводphp artisan route:list— если маршрута там нет, Laravel его не видит. - Class "App\Http\Controllers\PageController" not found. Забыли строку
use App\Http\Controllers\PageController;в началеweb.phpили ошиблись в имени класса. - Target class [PageController] does not exist. Обычно означает, что вы использовали старую строковую запись
'PageController@about'. Перейдите на формат[PageController::class, 'about']. - Изменения не видны в браузере. Иногда помогает сбросить кеш маршрутов:
php artisan route:clear. Кеш маршрутов новичку включать не нужно, но командаroute:cache, запущенная ранее, могла его создать. - php artisan serve не запускается, порт занят. Укажите другой порт:
php artisan serve --port=8001.
Что делать дальше
Связка «маршрут → контроллер → ответ» — фундамент. Следующие шаги в логичном порядке:
- Вернуть из контроллера Blade-шаблон вместо строки:
return view('about')и файлresources/views/about.blade.php. - Освоить именованные маршруты (
->name('about')) — они позволяют строить ссылки, не завися от конкретного URL. - Посмотреть ресурсные контроллеры:
php artisan make:controller PostController --resourceсразу создаёт методы для CRUD.
Сверяйтесь с официальной документацией по вашей версии — раздел Routing описывает все методы Route, а раздел Controllers — виды контроллеров.
Проверка рекламы на риски: Что в макете вызовет вопросы ФАС: превосходные степени, сравнения, обещания результата, маркировка.
Спросить за 40 ₽Источники: Laravel Documentation — Routing, Laravel Documentation — Controllers
Частые вопросы
У меня Laravel 10, а не 11 — эта инструкция подойдёт?
Можно ли обойтись без контроллеров и писать всё в замыканиях?
Почему мой маршрут работает локально, но выдаёт 404 на боевом сервере?
Что будет, если два маршрута отвечают на один и тот же URL?
Обязательно ли имя параметра в {id} совпадать с именем аргумента метода?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.