@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');
});
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 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?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы