Laravel 5.5验证失败时响应的验证更改格式

The*_*mie 3 php validation laravel laravel-5.5

在Laravel 5.4中,我们创建了一个继承所有验证请求的类,因为我们需要自定义响应。

class APIRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Response on failure
     * 
     * @param array $errors
     * @return Response
     */
    public function response(array $errors) {
        $response = new ResponseObject();

        $response->code = ResponseObject::BAD_REQUEST;
        $response->status = ResponseObject::FAILED;
        foreach ($errors as $item) {
            array_push($response->messages, $item);
        }
        return Response::json($response);
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

可以扩展此内容的示例请求如下所示

class ResultsGetTermsRequest extends APIRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'school_id' => 'required|integer',
            'student_id' => 'required|integer',
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们对失败的样本响应是

{
    "status": "FAILED",
    "code": "400",
    "messages": [
        [
            "The school id field is required."
        ],
        [
            "The student id field is required."
        ]
    ],
    "result": []
}
Run Code Online (Sandbox Code Playgroud)

但是,这对于Laravel 5.5不再有效。我注意到他们用替换了响应方法failedValidation。但是,如果请求未通过验证,则不会返回任何响应。如果取消注释print_r,则返回某些内容。似乎永远不会执行的唯一一行是return语句。我想念什么?

 public function failedValidation(Validator $validator) {

        $errors = (new ValidationException($validator))->errors();
        $response = new ResponseObject();

        $response->code = ResponseObject::BAD_REQUEST;
        $response->status = ResponseObject::FAILED;
        foreach ($errors as $item) {
            array_push($response->messages, $item);
        }
        //print_r($response);
        return Response::json($response);
    }
Run Code Online (Sandbox Code Playgroud)

lag*_*box 6

如果你想从 FormRequest 类中做到这一点,可能是这样的:

protected function buildResponse($validator)
{
    return response->json([
        'code' => ResponseObject::BAD_REQUEST,
        'status' => ResponseObject::FAILED,
        'messages' => $validator->errors()->all(),
    ]);
 }

protected function failedValidation(Validator $validator)
{
    throw (new ValidationException($validator, $this->buildResponse($validator));
}
Run Code Online (Sandbox Code Playgroud)

这会将您正在构建的响应添加到验证异常中。当异常处理程序尝试呈现它时,它将检查是否response已设置,如果已设置,它将使用您传递的响应,而不是尝试将 ValidationException 转换为响应本身。

如果您希望“所有”验证异常最终以这种格式呈现,我可能只是在异常处理程序级别执行此操作,因为异常处理程序已经能够将这些异常转换为 Json,因此您可以更改格式处理程序本身,基本上根本不必对默认 FormRequest 进行任何调整。


vij*_*mar 5

我想按照laravel 升级指南,我们应该返回HttpResponseException

protected function failedValidation(Validator $validator)
{
    $errors = $validator->errors();
        $response = new ResponseObject();

        $response->code = ResponseObject::BAD_REQUEST;
        $response->status = ResponseObject::FAILED;
        foreach ($errors as $item) {
            array_push($response->messages, $item);
        }

    throw new HttpResponseException(response()->json($response));
}
Run Code Online (Sandbox Code Playgroud)