Как сделать что бы на один уровень вложенности обрабатывался разными контроллерами в Laravel 5?

Здравствуйте.
Есть сайт на Laravel 5, сейчас там реализованы разные типы страниц с разными уровнями вложенности.
К примеру статьи доступны по адресу site.ru/category/cat-name/article-name/ (category - статическое слово)
Есть еще другие типы записей, которые доступны по адресу site.ru/cat-name/cat-sub-name/article-name/
Еще таких несколько типов записей, где после имени сайта идет статическое слово, по нему и в роутах смотрим какой контроллер подключить. Для каждого типа записи своя таблица в БД.
Route::get('/category/{category}/{article_slug}/', ['as' => 'article', 'uses' => 'ArticleController@article']);

Сейчас говорят нужно убрать вложенность и что бы все статьи были на первом уровне вложенности, т.е. доступны по адресу site.ru/article-name/ и так все записи со всех типов.
Как такое можно реализовать?
  • Вопрос задан
  • 506 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Yan-s
По какой причине кого то беспокоит уровень вложенности в урл? Как этот кто то предлагает разрешать ситуацию, совпадения идентификаторов в урл?

Если задача избавится именно от вложенности (слеши), то можно использовать префиксы, например:
Route::get('/article_{article_slug}/', ['as' => 'article', 'uses' => 'ArticleController@article']);
Route::get('/category_{category}/', ['as' => 'category', 'uses' => '...']);
Ответ написан
@Kostik_1993
Web Developer
Создаете таблицу urls или как хотите ее назовите, у нее будут поля id, slug, sluggable_type, sluggable_id
Если вы смогли заметить то мы будем использовать полиморфные отношения
Создаете один контроллер, который будет обрабатывать все запросы, получать строку по Slug, затем исходя из типа получаете нужную модель, тут скорее всего придется написать сервис который будет обрабатывать полученный результат и играть роль универсального контроллера, который будет получать модель, а затем в зависимости от типа и вызывать нужный view
Ответ написан
Комментировать
@iljaGolubev
А в чём проблема то? Если все статьи лежат в одной таблице, то:
// GET site.ru/seo_friendly_article_name
Route::get('/{article_slug}', 'ArticleController@article');

// в контроллере
public function article(Article $article_slug){
    // определяете нужное представление
     return view("articles.categories.{$article_slug->category_id}.show", ['article' => $article_slug]);
}
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы