Маршрут Laravel получает неправильный контроллер

#laravel #vue-router

#laravel #vue-маршрутизатор

Вопрос:

Я создаю проект с помощью Laravel и Vue, и я хочу, чтобы URL-адреса моих категорий и тегов были такими:

domain.com/some-tag

domain.com/some-category

Мой web.php:

 Route::get('/', ['uses' => 'AppHttpControllersIndexController@index']);

Route::get('/{category}', ['as' => 'category', 'uses' => 'AppHttpControllersCategoryController@index']);

Route::get('/{tag}', ['as' => 'tag', 'uses' => 'AppHttpControllersTagController@index']);

Route::get('/{category}/{article}', ['as' => 'category.article', 'uses' => 'AppHttpControllersArticleController@index']);
  

Я получаю ошибку 404 в моих ссылках на теги, и я знаю это, потому что маршрутизатор сначала соответствует «категории» и использует CategoryController.

Что мне делать? Я не хочу делать их уникальными, добавляя что-то вроде domain.com/tags/tag-name

Я пытался использовать именованные маршруты для моего компонента vue (с библиотекой Ziggy-js), поэтому моя ссылка выглядит следующим образом

 <a class="tags-block__link" :href="route('tag', {tag: tag.slug}).url()" v-for="tag in tags" :key="tag.id">
  

Но это не помогает

Комментарии:

1. /{category} и /{tag} неоднозначны; невозможно определить, к какому маршруту вы хотите перейти подобным образом, поэтому компилятор по умолчанию использует более поздний (или более ранний; я забыл, какой) определенный. Вам нужно было бы различать их, например, /category/{category} и /tag/{tag} или что-то подобное.

Ответ №1:

Почему он не должен смешиваться?

Вы определяете Route::get('/{category}' и Route::get('/{tag}' . Поэтому, если вы откроете /1 в своем браузере, он всегда будет запускать первый маршрут, который он сможет найти, который соответствует шаблону. Значит, он всегда запущен CategoryController@index да?

Ваши маршруты должны быть:

 Route::get('/category/{category}', ['as' => 'category', 'uses' => 'AppHttpControllersCategoryController@index']);

Route::get('/tag/{tag}', ['as' => 'tag', 'uses' => 'AppHttpControllersTagController@index']);
  

Подробнее на https://laravel.com/docs/7.x/routing

Оставшийся маршрут должен работать нормально, потому что вы определяете его последним.

Комментарии:

1. Я бы все равно изменил оставшийся маршрут, чтобы он соответствовал другим и документации Laravel для вложенных ресурсов (см. Страницу контроллера).

2. согласен с вами. но иногда это полезно. Но это вызовет проблему, когда ссылка будет /category/tag , потому что она может быть предназначена для открытия последнего маршрута в списке.

3. Я думал, что есть способ сохранить URL-адреса чистыми без уродливых родительских категорий / тегов. Довольно неприятно