@SpinPr

Как в Laravel правильно организовать ветвление в роуте?

Разделы меню, бренды и товары хранятся в таблицах. Таблицы имеют поля SLUG.

"В лоб" в routes.php это выглядит так:

// выделяем 1-й элемент uri
$url_path = parse_url(Request::url(), PHP_URL_PATH);
$uri_parts = explode('/', trim($url_path, ' /'));
$module = array_shift($uri_parts);

// Проверяем наличие в таблице МЕНЮ
if( \App\Menu::where('slug', '=', $module)->first(['id'])) {
// Выводим товары
Route::get('{module}/{page?}', ['uses'=>'GoodsController@index', 'as'=>$module])->where('page','^page-([2-9]|[1-9]{1}[0-9]+)\z');
// Выводим конкретрый товар
Route::get('{module}/{good}', 'GoodController@index');
}

Такая обработка наверное не совсем правильная...
  • Вопрос задан
  • 188 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol Куратор тега Laravel
нельзя просто так взять и загуглить ошибку
Конечно не совсем правильная, свой роутер на коленке получился.

В чем проблема сделать 3 отдельных роута для меню, брендов, товаров?
И тогда они не будут пересекаться, и не надо будет делать вот эту кашу малашу с определением куда зашел пользователь.

/menu/{slug}
/brand/{slug}
/product/{slug}

И искать уже конкретную позицию по slug в нужном контроллере/модели, или даже искать не надо, а использовать готовый трейт https://github.com/cviebrock/eloquent-sluggable
или вообще из коробки https://laravel.com/docs/5.6/routing#route-model-b...
Ответ написан
@iljaGolubev
Если работает - правильная. Но не красиво.
1. Для пагинации есть https://laravel.com/docs/5.6/pagination. Так что {page} тут лишний. И вообще - /brand/2 - 2 должен быть брэндом на не номером страницы.
2. Я так понял, что brand|product длжны быть в таблице меню? Роуты можно регистрировать в цикле по таблице меню: не зарегистрирован - значит не найден. что-то вроде
foreach(\App\Menu::all() as $menu){
    Route::get($menu->module_slug, $menu->module_slug.'Controller@index');
    Route::get($menu->module_slug.'/{slug}', $menu->module_slug.'Controller@by_slug');
}
// хотя если пунктов меню не слишком много лучше сделать как предложено выше
...
// module_slug = 'Brand'
class BrandController{
    ... index(){}
    .... by_slug(\App\Brand $slug){}
}
+ использовать https://laravel.com/docs/5.6/routing#route-model-b...
Ответ написан
Ваш ответ на вопрос

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

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