У меня определен этот маршрут:
Route::match(['get', 'post'], '/{class}/{function}/', [OldBackendController::class, 'apiV1']);
Если я сделаю этот запрос:
POST /api/v2_1/wishlist/archive
Laravel вводит int в OldBackendController, и значение переменной $class (в контроллере) следующее:
api/v2_1/wishlist
Почему? В контроллер он входить не должен, так как в запросе не 2 переменные, а 4.
Странно то, что если в контроллере я напечатаю значение $request->segments(), я получу все 4 сегмента:
Array
(
[0] => api
[1] => v2_1
[2] => wishlist
[3] => archive
)
тем не менее маршрут определяет 2 переменные, а не 4
какой веб-сервер вы используете? как ты настроил красивые URL-адреса/переписывание URL-адресов?
Как вы упомянули в комментарии к ответу ниже, согласно документации/ должен быть автоматически исключен из любого параметра маршрута. Для ясности: как выглядит подпись вашего метода apiV1()? Маловероятно, но $class и $function могут быть зарезервированными словами. Пробовали ли вы использовать другие имена параметров?
@Don'tPanic public function apiV1(Request $request, string $class, string $function,)
Маршрут определен в routes/api.php? Есть ли для него какие-то префиксы или группы? Возможно ли, что другой маршрут совпадает и конфликтует, что-нибудь изменится, если вы временно удалите все остальные маршруты как в api.php, так и в web.php?






Ваш маршрут содержит две переменные, но, как вы видели, он попытается интерпретировать любой uri для этой переменной, насколько это возможно, и в конечном итоге вы разобьете uri /api/v2_1/wishlist/archive на две переменные api/v2_1/wishlist и archive.
Что вам нужно, так это указать маршруту, чтобы он не соответствовал символу / внутри переменных.
Route::match(['get', 'post'], '{class}/{function}', [OldBackendController::class, 'apiV1'])
->where('class', '[A-Za-z]+')->where('function', '[A-Za-z]+');
Вы можете адаптировать регулярное выражение, если ваша функция содержит _ или - или числовые символы.
Для получения дополнительной информации ознакомьтесь с Документацией.
Примечание. Во всех случаях вам следует поместить этот маршрут в конец файла маршрута, поскольку он будет совпадать со всем, что имеет два сегмента URI, и вызовет у вас головную боль в будущем.
Понятно. Меня беспокоит, почему я должен исключить символ / с регулярным выражением. Laravel должен автоматически исключить его.
@GiacomoM, в этом прелесть собственности «Dynamic». Там оно будет соответствовать чему угодно. Да, изначально это не очень понятно, и лучше всего никогда не использовать такой маршрут. Это вызовет множество проблем: этот маршрут также перехватит ваши маршруты 404 и вызовет ваш контроллер.
@AnujShrestha Конечно, похоже, что именно это и происходит, но нет, они не должны там ничего совпадать, как уже указывал ОП. Из документации: «Компонент маршрутизации Laravel позволяет всем символам, кроме /, присутствовать в значениях параметров маршрута. Вы должны явно разрешить / быть частью вашего заполнителя, используя регулярное выражение условияwhere».
Да, я только что попробовал, и Laravel справляется с этим правильно и без использования регулярных выражений. он не пойдет туда, если путь маршрута больше или меньше 2. Понятия не имею, почему он не работает для OP.
Ваш маршрут имеет оба динамических параметра, поэтому положение вашего маршрута здесь очень важно. Этот маршрут должен находиться в конце файла маршрута.