Другой метод, вызываемый при использовании проверки запроса формы Laravel

#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 .