Задать вопрос
@powercoder

Как построить цепочку роута не прибегая использованию модели для алфавитной литеры?

Здравствуйте. Подскажите, как построить цепочку роута так, чтобы ссылка на модель была следующей структуры /genres/f/fantasy, не прибегая использованию модели для алфавитной литеры?

Пробовал способом ниже, но проблема заключается в том, что на третьем уровне вложенности, когда мы изменяем литеру, например, так /genres/g/fantasy- не выводится 404 ошибка, страница всё-равно доступна.

PS. У данной цепочки ещё планируется дополнительная вложенность - модель книги

Route::group(['namespace' => 'Books', 'prefix' => 'genres'], function() {
    //Все жанры
    Route::get('/', 'IndexController')->name('pages.books');

    //Все жанры -> {литера}
    Route::get('/{litera}', 'LiteraController', function ($firstLetter = null) {
        return $firstLetter;
    })->where(['litera' => '[a-z0-9]+'])->name('pages.books.litera');

    //Жанр
    Route::get('/{litera}/{genre}', 'IndexController')->name('pages.genre');
});
  • Вопрос задан
  • 124 просмотра
Подписаться 1 Простой 4 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
Ну если вы хотите валидировать это на уровне роутов чисто теоретически можно прописать /genres/{literaAndGenre} где регуляркой проверять что первый символ совпадает с начальным символом слова. Регулярка для этого простая
([a-z])\/\1[^\/]+
Но ввиду того что laravel эту регулярку под себя подправляет - она бьется и не работает в простом виде. Но так сказать нет препятствий патриотам для костылирования.
Route::any('/genres/{literaGenre}', function ($literaAndGenre) {
dump('Got it', explode('/', $literaAndGenre));
})->where(['literaGenre' => '(?P<litera>[a-z]{1})\/(?P=litera)[^\/]+']);


/genres/f/fantasy - будет работать
/genres/g/fantasy - не будет работать

Но есть один минус - от такого костылирования умирает route:cache, надо патчить

З.Ы. Решение дерьмо конечно. Не легче ловить все подобное в контроллер и там при не совпадении выбрасывать 404? Или на уровне middleware или custom model binding?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽