Базовое определение маршрута со слагом
Маршруты в Laravel описываются в специальном файле, где для каждого адреса указывается обработчик. Чтобы адрес был человекопонятным, вместо числового идентификатора в шаблон подставляют символьный код записи — слаг.
Route::get('/blog/{post:slug}', [PostController::class, 'show'])
->name('posts.show');
Запись {post:slug} сообщает фреймворку, что нужную запись следует искать по полю slug, а не по числовому идентификатору.
Именованные маршруты как защита от поломанных ссылок
Название маршрута позволяет строить ссылки в шаблонах по имени, а не жёстко прописывать адрес. Если структура адреса когда-нибудь изменится, достаточно поправить определение маршрута, а все ссылки, сформированные через имя, обновятся автоматически.
- ссылки в шаблонах строятся вызовом по имени маршрута;
- меняется один файл, а не сотни шаблонов;
- снижается риск забытых устаревших ссылок внутри сайта.
Хранение слага и контроль его уникальности
Слаг должен храниться в отдельном поле таблицы и быть уникальным. Чтобы гарантировать это на уровне базы данных, поле снабжают уникальным индексом, а при создании записи проверяют отсутствие совпадений и при необходимости добавляют уточняющий суффикс.
$table->string('slug')->unique();
Транслитерация при генерации слага из заголовка
Для преобразования кириллического заголовка в слаг обычно используют вспомогательные функции фреймворка, но они применяют собственную схему транслитерации. Если для вашего проекта важно соответствие правилам Яндекса, проверьте результат на характерных буквах или подключите собственное преобразование по таблице транслитерации.
Что происходит при смене слага записи
Если слаг записи изменился, старый адрес перестанет находить материал. Чтобы не потерять трафик, при изменении слага необходимо сохранять предыдущее значение и настраивать перенаправление на новое.
- храните историю слагов в отдельной таблице;
- при обращении по старому слагу отдавайте редирект с кодом 301;
- не допускайте повторного использования старого слага для другой записи.
Группировка маршрутов и общие префиксы
Маршруты, относящиеся к одному разделу, удобно объединять в группу с общим префиксом. Это делает структуру адресов наглядной и упрощает последующее изменение: достаточно поправить префикс один раз для всей группы.
Route::prefix('blog')->group(function () {
Route::get('/', [PostController::class, 'index']);
Route::get('/{post:slug}', [PostController::class, 'show']);
});
Кеширование маршрутов в рабочей среде
Для ускорения работы в боевом окружении Laravel умеет кешировать список маршрутов. После любого изменения определений маршрутов не забывайте очищать и пересоздавать этот кеш, иначе новые адреса не заработают, а старые продолжат отвечать по прежней схеме.
Автоматические тесты для важных адресов
Для ключевых маршрутов стоит написать простые тесты: запрос к адресу должен вернуть ожидаемый код ответа, а обращение к несуществующему слагу — код 404. Такие проверки запускаются при каждом изменении кода и мгновенно сигнализируют, если правка сломала адреса, важные для индексации.
Частые вопросы
Зачем в Laravel использовать именованные маршруты?
Они позволяют строить ссылки по имени, поэтому при изменении структуры адреса достаточно поправить определение маршрута, а не искать жёстко прописанные ссылки по всему коду.
Как искать запись по слагу, а не по идентификатору?
В определении маршрута указывают поле привязки, например запись вида {post:slug}, и фреймворк автоматически найдёт нужную запись по этому полю.
Как обеспечить уникальность слага?
Используйте уникальный индекс поля в базе данных и проверяйте совпадения при создании записи, добавляя при необходимости уточняющий суффикс.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.