#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-адреса чистыми без уродливых родительских категорий / тегов. Довольно неприятно