Laravel验证总是从API返回200 OK

时间:2018-09-26 15:32:29

标签: php laravel validation

我想将验证器与控制器分开,但API始终在Postman中以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

7 个答案:

答案 0 :(得分:1)

您没有验证数据,只是获取输入指令,它必须通过验证:

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);
}
  

Source:如果验证规则通过,您的代码将继续正常执行;但是,如果验证失败,则会引发异常,并且适当的错误响应将自动发送回用户。对于传统的HTTP请求,将生成重定向响应,而将为AJAX请求发送JSON响应。

     

Source:在AJAX请求期间使用validate方法时,Laravel将不会生成重定向响应。相反,Laravel会生成一个包含所有验证错误的JSON响应。该JSON响应将以422 HTTP状态代码发送。

答案 1 :(得分:1)

您应确保发送的请求带有Accept: application/json标头。

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

答案 2 :(得分:0)

您的邮递员响应将发回welcome.blade.php默认视图。这意味着它没有命中您的控制器方法,因为该方法返回Resource实例。这意味着验证器将不会运行。

检查您要发送请求的路线绝对是正确的路线。另外,请检查您是否在发出POST请求而不是GET请求。

答案 3 :(得分:0)

保存之前,您必须先验证您的请求

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);

}

答案 4 :(得分:0)

我通过在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()
        ]);
    }

答案 5 :(得分:0)

使用注入的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));
    }
}

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

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

答案 6 :(得分:0)

如果您要邮递员要求,请务必检查邮件头

Accept = 'application/json'