Проверка Laravel всегда возвращает 200 OK от API - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу разделить свой валидатор с моим контроллером, но API всегда отвечает 200 OK в Почтальоне.

Запрос проверки :

class PostRequest extends FormRequest
{
    use Types;

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        // $auth = $this->request->user();
        return [
            'name'       => 'required|string|max:255',
            'country_id' => 'required|exists:countries,id',
            'city'       => 'required|max:255',
            'phone_no'   => 'required|regex:/[0-9]{10,13}/',
            'occupation' => 'required|max:255'
        ];
    }
}

SenderController :

public function store(PostRequest $request)
{
    $auth = $request->user();

    $sender = Sender::create([
        'name'          => $request->name,
        'country_id'    => $request->country_id,
        'city'          => $request->city,
        'phone_no'      => $request->phone_no,
        'occupation'    => $request->occupation
    ]);
    return new Resource($sender);
}

Когда я отправляю запрос без name, он возвращает ответ со статусом 200. Я хочу отобразить $validator->errors() в моем ответе, когдаЯ забыл ввести имя.Как я могу это сделать?

Postman

Маршрут и звонок :

Route::post('sender', 'V1\SenderController@store');

POST: localhost:8000/api/v1/sender

Ответы [ 6 ]

0 голосов
/ 12 марта 2019

Вы должны убедиться, что отправляете запрос с заголовком Accept: application/json.

Без этого - Laravel не обнаружит, что это запрос API, и не сгенерирует ответ 422 с ошибками..

0 голосов
/ 27 декабря 2018

Правильный способ отображения ошибок валидации с использованием внедренного объекта FormRequest - переопределение failedValidation.

. Как указано ранее в разделе комментариев, внедренный объект FormRequest сам проверяет запрос, нет необходимостиподтвердите это во второй раз в теле контроллера (это одно из главных преимуществ этого).Если проверка не пройдена, вы все равно не попадете в тело контроллера.

Создайте абстрактный класс, расширяющий FormRequest и переопределяющий failedValidation.

<?php

namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\Response;

abstract class BaseFormRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    abstract public function rules(): array;

    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    abstract public function authorize(): bool;

    /**
     * Handle a failed validation attempt.
     *
     * @param  Validator  $validator
     *
     * @return void
     */
    protected function failedValidation(Validator $validator): void
    {
        $errors = $validator->errors();

        throw new HttpResponseException(response()->json([
            'errors' => $errors
        ], Response::HTTP_UNPROCESSABLE_ENTITY));
    }
}

Теперь вы можете расширять BaseFormRequest на всех ваших API запрашивают классы проверки.Ошибки проверки теперь будут отображаться в виде JSON-сообщения с HTTP-кодом Unprocessable Entity (422).

Источник: https://medium.com/@Sirolad/laravel-5-5-api-form-request-validation-errors-d49a85cd29f2

0 голосов
/ 27 сентября 2018

Я решил проблему с добавлением дополнительного кода в мой PostRequest.php

public $validator = null;
protected function failedValidation($validator)
{
    $this->validator = $validator;
}

, и я показываю сообщение об ошибке с помощью контроллера

if (isset($request->validator) && $request->validator->fails()) {
        return response()->json([
            'error_code'=> 'VALIDATION_ERROR', 
            'message'   => 'The given data was invalid.', 
            'errors'    => $request->validator->errors()
        ]);
    }
0 голосов
/ 26 сентября 2018

Вы не проверяете данные, вы просто получаете направление ввода, оно должно пройти проверку:

public function store(PostRequest $request)
{
    $auth = $request->user(); // don't know what this is for? seems unused

    $validated = $request->validated(); // returns array of validated data or error

    $sender = Sender::create($validated);

    return response()->json($sender);
}

Источник : Если правила проверки пройдены,ваш код будет работать нормально;однако, если проверка не пройдена, будет выдано исключение, и правильный ответ об ошибке будет автоматически отправлен обратно пользователю.В случае традиционного HTTP-запроса будет сгенерирован ответ о перенаправлении, а JSON-ответ будет отправлен для AJAX-запросов.

Источник : При использовании метода validate во время запроса AJAX Laravel не будет генерировать ответ перенаправления.Вместо этого Laravel генерирует ответ JSON, содержащий все ошибки проверки.Этот ответ JSON будет отправлен с кодом состояния HTTP 422.

0 голосов
/ 26 сентября 2018

Вы должны подтвердить свой запрос перед сохранением

public function store(PostRequest $request)
{
    $auth = $request->validate();

    if($auth->fails())
    {
         return response()->json($auth->errors());
    }
    $sender = Sender::create([
        'name'          => $request->name,
        'country_id'    => $request->country_id,
        'city'          => $request->city,
        'phone_no'      => $request->phone_no,
        'occupation'    => $request->occupation
    ]);
     return new Resource($sender);

}
0 голосов
/ 26 сентября 2018

Ваш ответ почтальона отправляет обратно welcome.blade.php представление по умолчанию.Это означает, что он не затрагивает ваш метод контроллера, так как метод возвращает экземпляр Resource.Это означает, что валидатор не будет запущен.

Убедитесь, что маршрут, на который вы делаете запрос, определенно является правильным маршрутом.Также убедитесь, что вы делаете запрос POST вместо GET запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...