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

Здравствуйте. При создании сайта изначально были роуты для категорий и подкатегорий:
Route::pattern('category', '[a-zA-Z0-9\-]+'); // Такие паттерны у всех роутов
Route::get('/{auto}/{country}/', ['as' => 'country', 'uses' => 'AutoController@country']);
Route::get('/{auto}/{country}/archive/', ['as' => 'country.archive', 'uses' => 'AutoController@countryArchive']);
Route::get('/{auto}/{country}/{mark}/', ['as' => 'mark', 'uses' => 'AutoController@mark']);
Route::get('/{auto}/{country}/{mark}/archive/', ['as' => 'mark.archive', 'uses' => 'AutoController@markArchive']);

В контроллере если данных нету то вызываю App::abort(404); Когда добавил новые роуты, то перестали работать старые (выдавалась 404 ошибка), выше написаны чем прошлые.
Route::get('/{category}/', ['as' => 'category.list', 'uses' => 'ArticleCategoriFrontendController@list']); 
Route::get('/{category}/{article_slug}/', ['as' => 'article', 'uses' => 'ArticleCategoriFrontendController@article']);

Вот у меня и возник вопрос как этого можно избежать, уже использовал стандартные функции как link_to_route, link_to_action но по прежнему ничего. Код:
<?php echo link_to_route('category.list', 'obuchenie', ['obuchenie'] ); ?>
<?php echo link_to_action('ArticleCategoriFrontendController@list', 'obuchenie2', ['obuchenie'] ) ?>
<a href="{{route('category.list',['obuchenie']) }}">obuchenie3</a>

Оказывается оно перекидывает на другой роут
Route::get('/{page}/', ['as' => 'page', 'uses' => PageController@page']);
  • Вопрос задан
  • 382 просмотра
Решения вопроса 2
neuotq
@neuotq
Прокрастинация
Как он узнает {auto} отличается от {page} или {category}? Ответ никак, так как они идентичны поэтому всегда срабатывает auto.
Тебе нужно придумывать либо префикс Route::prefix('auto') (типа auto_{auto}), либо для каждого писать паттерн правило именования(на переменные что формирует путь, ), либо внутри писать обработчик которые если не найдет auto по правилам перекидыват на page и тд).
Короче говоря, изучи https://laravel.com/docs/5.4/routing , есть возможность расписать расписать свою логику работы роутера, но это все усложнит.
Я думаю твой вариант перейти на префиксы и все будет красиво и быстро работать.
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Роутер не сможет никак различить /{auto}/, /{page}/ и /{category}/. Вам нужно для каждого раздела сайта сделать постоянный уникальный префикс. Что-то вроде такого: /cars/{auto}/, /pages/{page}/ и /categories/{category}/.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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