Laravel 验证总是从 API 返回 200 OK

Jam*_*ady 9 php validation laravel

我想将我的验证器与我的控制器分开,但 API 总是200 OK在 Postman 中响应。

请求验证

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'
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

发件人控制器

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);
}
Run Code Online (Sandbox Code Playgroud)

当我发送一个没有 的请求时name,它会返回一个状态为 200 的响应。我想$validator->errors()在我忘记输入名称时显示在我的响应中。我怎样才能做到这一点?

邮差

路由和呼叫

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

POST: localhost:8000/api/v1/sender
Run Code Online (Sandbox Code Playgroud)

Tsp*_*oon 35

您应该确保使用Accept: application/json标头发送请求。

没有它 - Laravel 不会检测到它是一个 API 请求,也不会生成带有错误的 422 响应。


Md.*_*san 11

如果您向邮递员请求,请务必检查标头并设置

Accept = 'application/json'
Run Code Online (Sandbox Code Playgroud)


Xar*_*ick 5

使用注入对象显示验证错误的正确方法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));
    }
}
Run Code Online (Sandbox Code Playgroud)

您现在可以扩展BaseFormRequest所有 API 请求验证类。验证错误现在将显示为带有不可处理实体 (422) HTTP 代码的 JSON 编码消息。

来源:https://medium.com/@Sirolad/laravel-5-5-api-form-request-validation-errors-d49a85cd29f2


Jam*_*ady 3

我通过在我的中添加更多代码解决了这个问题PostRequest.php

public $validator = null;
protected function failedValidation($validator)
{
    $this->validator = $validator;
}
Run Code Online (Sandbox Code Playgroud)

我使用控制器显示错误消息

if (isset($request->validator) && $request->validator->fails()) {
        return response()->json([
            'error_code'=> 'VALIDATION_ERROR', 
            'message'   => 'The given data was invalid.', 
            'errors'    => $request->validator->errors()
        ]);
    }
Run Code Online (Sandbox Code Playgroud)