使用自定义表单请求类时检查是否存在任何验证错误

时间:2017-04-03 06:46:43

标签: php laravel validation

我正在使用Laravel 5.4。我有一个自定义表单请求类,我有我的验证规则和消息,我在我的控制器中使用它,如下所示:

public function store(CustomFormRequest $request)
{
  //
}

我正在使用ajax发送请求,当有任何验证错误时,Laravel会抛出一个带有422状态代码的HTTP响应错误,其中包含验证错误的JSON表示。

但我不希望如此。相反,在我的控制器方法中,我想知道是否存在任何验证错误,如果有,那么我想要返回带有一些额外数据的响应以及验证消息,如下所示:

// Inside my Controller
public function store(CustomFormRequest $request)
{
   if ($validator->fails())
   {
        $errors = $validator->errors();

        return response()->json(array('status' => 2, 'msg' => $errors->all() ));
    }
}
你可以帮忙吗? 提前谢谢。

4 个答案:

答案 0 :(得分:3)

最简单的方法是覆盖Form Request类的response()方法。

要做到这一点,您只需在课堂上添加以下内容:

public function response(array $errors)
{
    if ($this->expectsJson()) {
        return new JsonResponse(['status' => 2, 'msg' => $errors], 422);
    }

    return parent::response($errors);
}

不要导入Illuminate\Http\JsonResponse

希望这有帮助!

答案 1 :(得分:0)

我知道您需要控制器中的逻辑,但您仍然可以利用您的Request文件。在Laravel文档中(假设您使用的是最新版本),它被描述为Adding After Hooks To Form Requests

如果要在表单请求中添加“after”挂钩,可以使用withValidator方法。此方法接收完全构造的验证器,允许您在实际评估验证规则之前调用其任何方法:

/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

答案 2 :(得分:0)

试试这个:

form.ajaxSubmit({
    async: false,
    type: yourMethod,
    url: yourRoute,
    headers: { 'X-CSRF-TOKEN': "{{csrf_token()}}" },
    dataType: 'json',
    success: function(data){
        location.href = data.redirect_to;
    },
    error: function(data) {
        var errors = data.responseJSON;
        var errorsArr = [];
        for (error in errors) {
            errorsArr.push(errors[error]);
        }

        errorsArr = $.map(errorsArr, function(n){
            return n;
        });

        alert("<strong class='text-danger'>" + errorsArr.join("<br>") + "</strong>");
        console.log(errors);

    }
});

并在您的控制器存储方法中返回:

return response()->json(['redirect_to' => '/your_route']);

答案 3 :(得分:0)

在更新laravel文档后,您不再需要覆盖响应(),您只需要在自定义FormRequest类中的受保护的failValidation()中编写您的业务逻辑,如下所示,

    use Illuminate\Http\Exceptions\HttpResponseException;
    use Illuminate\Contracts\Validation\Validator;

    /**
    * [failedValidation [Overriding the event validator for custom error response]]
    * @param  Validator $validator [description]
    * @return [object][object of various validation errors]
    */
    public function failedValidation(Validator $validator) { 
         //write your bussiness logic here otherwise it will give same old JSON response
        throw new HttpResponseException(response()->json($validator->errors(), 422)); 
    }