Маршруты и контроллеры

Рейтинг: 77.2% · 13 голосов
Курс по Laravel: маршруты, Eloquent, Blade, миграции, очереди и API. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
oleg_php
Сообщения: 25
Зарегистрирован: 14 май 2026, 08:06

Маршруты и контроллеры

Сообщение oleg_php »

АкадемияLaravel с нуляГлава 2 из 18
Оглавление курса (18)
  1. Знакомство с Laravel и установка окружения
  2. Маршруты и контроллеры (вы здесь)
  3. Blade: шаблоны и вёрстка страниц
  4. Миграции и структура базы данных
  5. Eloquent ORM: модели и CRUD
  6. Связи в Eloquent: hasMany, belongsTo и другие
  7. Формы и валидация данных
  8. Аутентификация пользователей
  9. Middleware и защита маршрутов
  10. Очереди и фоновые задачи
  11. Отправка почты и уведомления
  12. Строим REST API на Laravel
  13. Авторизация: Gates и Policies
  14. Работа с файлами: загрузка, Storage, диски local и S3
  15. Тестирование: Pest и PHPUnit, фабрики, сидеры, RefreshDatabase
  16. Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
  17. Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)
  18. События и слушатели, кеширование, логирование
В первой главе мы поставили Laravel и убедились, что

Код: Выделить всё

php artisan serve
отдаёт стартовую страницу. Теперь разберём, как фреймворк решает, какой код выполнить для конкретного URL. Маршруты и контроллеры образуют скелет любого приложения на Laravel, без них дальше никуда.

Где объявляются маршруты:

Все веб-маршруты живут в файле routes/web.php. Откройте его, там уже есть один маршрут на главную страницу. Добавим свой:

Код: Выделить всё

use Illuminate\Support\Facades\Route;

Route::get('/about', function () {
    return 'Страница о проекте';
});
Route::get означает HTTP-метод GET. Есть также Route::post, put, patch и delete. Вторым аргументом идёт обработчик, пока что замыкание. Вернуть из него можно строку, массив (Laravel сам превратит его в JSON-ответ) или view. Сохраните файл и откройте /about в браузере, сервер из первой главы подхватит изменения без перезапуска.

Параметры маршрута:

Часто URL несёт данные: id поста, slug категории. Для этого есть параметры в фигурных скобках:

Код: Выделить всё

Route::get('/posts/{id}', function (string $id) {
    return 'Пост номер ' . $id;
})->whereNumber('id');
whereNumber ограничивает параметр цифрами: на /posts/abc такой маршрут не сработает, и Laravel вернёт 404. Есть ещё whereAlpha, whereIn и универсальный where с регулярным выражением. Параметр можно сделать необязательным, записав его как {page?}, тогда у аргумента функции должно быть значение по умолчанию.

Контроллеры:

Замыкания удобны для проб, но рабочую логику принято выносить в контроллеры, иначе web.php распухнет до нечитаемого состояния. Генерируем заготовку:

Код: Выделить всё

php artisan make:controller PostController
Появится файл app/Http/Controllers/PostController.php. Добавим в него два метода:

Код: Выделить всё

namespace App\Http\Controllers;

class PostController extends Controller
{
    public function index()
    {
        return ['posts' => ['Первый пост', 'Второй пост']];
    }

    public function show(string $id)
    {
        return 'Пост номер ' . $id;
    }
}
Пока возвращаем строки и массивы, нормальные HTML-шаблоны подключим в следующей главе про Blade. Маршруты теперь указывают на методы контроллера:

Код: Выделить всё

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index'])->name('posts.index');

Route::get('/posts/{id}', [PostController::class, 'show'])
    ->whereNumber('id')
    ->name('posts.show');
Обратите внимание на name(). Именованный маршрут позволяет строить URL хелпером route('posts.show', ['id' => 7]) вместо ручной склейки строк. Поменяете путь с /posts на /articles, и все ссылки, собранные через route(), обновятся сами.

Полный список маршрутов приложения показывает команда

Код: Выделить всё

php artisan route:list
. Привыкайте к ней сразу, она закрывает половину вопросов вида "почему у меня 404". Для типовых CRUD-наборов существуют ресурсные контроллеры (make:controller с флагом --resource плюс Route::resource), они дают сразу семь стандартных методов. Вернёмся к ним в главе про Eloquent, когда появится что создавать и удалять.

Типичные грабли:

Порядок маршрутов. Laravel сравнивает маршруты сверху вниз и берёт первый подходящий. Если объявить /posts/{id} раньше, чем /posts/create, запрос на /posts/create попадёт в show с id равным "create". Ставьте конкретные маршруты выше шаблонных или вешайте whereNumber, он отсечёт нечисловые значения.

Ошибка "Target class [PostController] does not exist". Почти всегда это забытый use App\Http\Controllers\PostController в начале web.php.

Кеш маршрутов. На проде маршруты кешируют командой route:cache ради скорости. Две ловушки: после деплоя новых маршрутов кеш нужно пересобрать (route:clear или повторный route:cache), а маршруты-замыкания закешировать вообще нельзя, команда упадёт с ошибкой сериализации. Ещё один довод переносить логику в контроллеры.

405 Method Not Allowed. Значит URL существует, но обслуживает другой HTTP-метод: например, форма шлёт POST, а маршрут объявлен через Route::get.

Что в итоге:

Вы умеете объявлять маршруты с параметрами и ограничениями, выносить обработчики в контроллеры, давать маршрутам имена и проверять всё через route:list. В следующей главе займёмся Blade и начнём отдавать нормальные HTML-страницы вместо строк и JSON.
👍1 ❤️2 🔥1 😄 🤔4
✔ Лучший ответ сформирован автоматически — kisel123
oleg_php писал(а):Laravel сравнивает маршруты сверху вниз и берёт первый подходящий а как это работает с Route::resource? он же сам регистрирует целую пачку маршрутов. если после него добавить свой /posts/popular, его перехватит show с id=popular? объявлять свои маршруты до resource?
Перейти к ответу →
Аватара пользователя
kisel123
Сообщения: 2
Зарегистрирован: 14 май 2026, 05:37

Re: Маршруты и контроллеры

Сообщение kisel123 »

✔ Лучший ответ — сформирован автоматически
oleg_php писал(а):Laravel сравнивает маршруты сверху вниз и берёт первый подходящий
а как это работает с Route::resource? он же сам регистрирует целую пачку маршрутов. если после него добавить свой /posts/popular, его перехватит show с id=popular? объявлять свои маршруты до resource?
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
suroka
Сообщения: 1
Зарегистрирован: 16 май 2026, 15:30

Re: Маршруты и контроллеры

Сообщение suroka »

спасибо за блок про кеш маршрутов, наступил на это на vps буквально на прошлой неделе. задеплоил, новый маршрут не виден, полчаса тупил, пока не вспомнил про route:clear. теперь в деплой-скрипте сразу route:cache после git pull
👍2 ❤️ 🔥 😄 🤔
Аватара пользователя
Msporsche
Сообщения: 2
Зарегистрирован: 14 май 2026, 22:13

Re: Маршруты и контроллеры

Сообщение Msporsche »

а если id у меня uuid, а не число? whereNumber тогда не подходит. покопался в доке и нашел ->whereUuid('id'), вроде работает. может стоило упомянуть в главе, uuid сейчас много где
👍1 ❤️2 🔥 😄 🤔
Аватара пользователя
joncez
Сообщения: 2
Зарегистрирован: 13 май 2026, 20:42

Re: Маршруты и контроллеры

Сообщение joncez »

делаю форму и шлю POST на маршрут, но ловлю не 405, а 419 page expired. это уже про csrf из главы про формы или я накосячил где-то в маршрутах?
👍1 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Знакомство с Laravel и установка окружения
Следующая глава →
Blade: шаблоны и вёрстка страниц

Все главы курса «Laravel с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Laravel с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость