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

标签 php laravel validation 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 [
            //
        ];
    }
}

下面显示了一个扩展它的示例请求

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',
        ];
    }
}

然后我们对失败的示例响应将是

{
    "status": "FAILED",
    "code": "400",
    "messages": [
        [
            "The school id field is required."
        ],
        [
            "The student id field is required."
        ]
    ],
    "result": []
}

但是,这在 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);
    }

最佳答案

我猜按照 laravel upgrade指导我们应该返回 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));
}

关于php - Laravel 5.5 验证失败时验证更改响应格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47690817/

相关文章:

php - 如何使用 PHP 和 MYSQL 创建饼图?

php - Laravel:如何将此 Sql 语句转换为 Eloquent 或查询生成器

PHP - 使用 cURL 时未设置 header

javascript - 选择单选按钮后的文本输入字段

php - 如何将 mysql 查询中的最大 id 存储到 php 变量中?

php - Laravel 查询 Or 运算符优先级

php - Laravel:配置文件中“::class”的含义

validation - 输入类型 ='number' 新验证删除了 Safari for iPhone iOS5 和最新的 Safari for Mac 中的前导零和格式数字

javascript - 如何在 View 中显示特定的 laravel 验证错误,而不是全部

asp.net - RequiredFieldValidator 在隐藏时仍然进行验证