Laravel 5.2 — как правильно прописать динамические роуты?

Здравствуйте!
Сайт со вложенными страницами (4 уровня) и товарами.
Страницы и товары хранятся в разных таблицах (pages и products).
Причем, товар и страница могут находиться на одном уровне.

Прописала роуты так:
Route::get('{parentOne}/{parentTwo}/{parentThree}/{page}', ['uses' => 'SiteController@pageFourLevel']);
Route::get('{parentOne}/{parentTwo}/{page}', ['uses' => 'SiteController@pageThreeLevel']);
Route::get('{parentOne}/{page}', ['uses' => 'SiteController@pageTwoLevel']);
Route::get('{page}', ['uses' => 'SiteController@pageOneLevel']);

Route::get('{categoryOne}/{categoryTwo}/{categoryThree}/{product}', ['as' => 'product.productInfo', 'uses' => 'ProductController@productThreeLevel']);
Route::get('{categoryOne}/{categoryTwo}/{product}', ['as' => 'product.productInfo', 'uses' => 'ProductController@productTwoLevel']);
Route::get('{categoryOne}/{product}', ['as' => 'product.productInfo', 'uses' => 'ProductController@productOneLevel']);

Но, естественно, при просмотре продукта получаем 404 (не найдено в Page), т.к. в роуты продукта просто не попадаем.
Подскажите, пожалуйста, как сделать правильно, очень не хочется писать глупости!
  • Вопрос задан
  • 2371 просмотр
Пригласить эксперта
Ответы на вопрос 6
chupacabramiamor
@chupacabramiamor
Инженегр-программист
Доброе утро.
Имеется очень удобная штука - Route::controller

Используется в файле с вашими роутами приблизительно так:
Route::controller('/products', 'ProductsController')

Где ProductController ваш контроллер, к которому будут цеплятся роуты динамически.

Например:
Роут метода GET к : /products/some-category/2

В контроллере выражается как:
public function getSomeCategory($id)
{
    // ...
}


Таким образом, ваши вложенности можно добавлять до бесконечности:
public function getSomeCategory($id, $subid, $subid, $subid)
{
    // ...
}

Соответствует URL:
Роут метода GET к : /products/some-category/2/15/10/20


Как-то так...
Ответ написан
@kirill-93
Не будет такое работать.
{parentOne}/{parentTwo}/{parentThree}/{page}
и 
{categoryOne}/{categoryTwo}/{categoryThree}/{product}

Это одно и тоже. Вы задаете 4 переменных в роуте, и там и там 4 переменных, ларавел отработает по первому совпадению.
Ответ написан
DJZT
@DJZT
Laravel - code for you
В дкокументации есть филтры для роутов по паттернам. Если у вас страницы в виде slug а категории в виде id, то можете применить фильтры и указать принудительно, что там только цифры, а там, соответственно, только символы + в конце цифры.(для уникальности slug)
Ответ написан
прочитайте про Optional Parameters и будет гараздо проще.
Ответ написан
Комментировать
ManMadeMind
@ManMadeMind
Судя по дате, уже наверное очень поздно с ответом. Но у меня сейчас была точно такая же проблема, при переходе по динамическим url laravel6 выдавал 404. Но, у меня всё решилось очень просто, я использовал кириллицу в url. Проверь, вдруг у тебя тоже что-то из значений имеет кириллические символы, или какие другие отличные от латиницы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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