#php #laravel #routes
#php #laravel #маршруты
Вопрос:
У меня есть controller ( APIFields
) с именем метода store
, маршрут к этому методу настроен следующим образом:
POST /api/templates/{template}/fields -> APIFields@store
Все работало правильно, пока я не создал очень простой класс проверки запроса формы со следующими правилами (это единственное, что я изменил, кроме возвращаемого значения для authorize
метода):
return [
'name' => ['required', 'alpha_num'],
'coordinates' => ['required', 'json'],
'type' => ['required', BaseField::RULE],
'page' => ['required', 'numeric'],
'readonly' => ['sometimes', 'boolean'],
'required' => ['sometimes', 'boolean']
];
После того, как я создал класс, я просто изменил класс запроса с Request
, на CreateFieldsRequest
, и это в значительной степени испортило всю маршрутизацию для этого маршрута. Вместо вызова store
Laravel, похоже, вызывает index
. Когда я CreateFieldsRequest
восстанавливаю только Request
класс, он снова ведет себя так, как должен.
Я не смог найти никакой информации по этой теме, и я снова и снова проверял, что у меня нет какой-либо неправильной маршрутизации или перенаправлений ни в одном из связанных классов.
Любая помощь или рекомендации по этому вопросу были бы весьма признательны, спасибо!
Ответ №1:
Когда я запускаю запрос через консоль разработчика Chrome в качестве POST-запроса, Laravel возвращает его как запрос «GET», не знаю почему.
Ошибка FormRequest
проверки вызывает перенаправление. Это поведение по умолчанию.
Если вы отправите запрос AJAX или запросите ответ Accept
JSON с заголовком, он ответит списком ошибок проверки в формате JSON и 422 HTTP-кодом вместо этого.
Комментарии:
1. Спасибо! Я обнаружил проблему по этому поводу в репозитории, как только понял, что проблема возникла из-за перенаправления. Добавление
X-Requested-With
заголовка также исправило это.
Ответ №2:
После выполнения очень простого теста я понял, что это, похоже, проблема с Postman. Если вы столкнулись с этой проблемой, добавьте _method=POST
параметр в текст вашего сообщения или просто используйте XHR или другой инструмент тестирования API.
Редактировать: после дальнейшего тестирования я понял, что проблема не была исправлена. Когда я запускаю запрос через консоль разработчика Chrome в качестве POST-запроса, Laravel возвращает его как запрос «GET», не знаю почему.
Комментарии:
1. Это необходимо только в том случае, если вы не отправляете запрос как фактический POST. Postman абсолютно может это сделать, но похоже, что вы отправляете какой-то другой тип запроса (скорее всего, GET).
2. Да, я понял, что проблема не была исправлена. Однако я заметил, что когда я отправляю запрос в виде POST-запроса через консоль разработчика Chrome, Laravel возвращает его обратно, а затем Chrome показывает его как запрос GET. Как только я меняю тип запроса обратно на
Request
, он показывает тип запроса POST, как и должен.3. Похоже, вы получаете перенаправление из-за неудачной проверки, что является поведением по умолчанию для FormRequest .