Laravel 自定义验证和 ajax

Posted

技术标签:

【中文标题】Laravel 自定义验证和 ajax【英文标题】:Laravel custom validation and ajax 【发布时间】:2018-05-31 20:10:09 【问题描述】:

我的 Laravel 4.2 项目的验证是使用 Ardent 包完成的。在使用 Laravel 5.5 之后,我已经淘汰了 Ardent,并希望通过表单请求进行 Laravel 的本机验证。

我遇到的问题是 Ajax 调用之前是这样验证的:

public function postRegisterAjax(A)

    try 
         ...
     catch (ExceptionBag $e) 
        $msg = $e->getMessageBag()->all(':message');
        $status = Status::ERROR;
    

    return $this->responseJson($status, $msg);

现在我介绍了UserValidationRequest 类,我希望 Ajax 调用向我抛出错误消息,而无需重新加载页面。为此,我需要将状态和消息作为 Json 响应转发。

我以某种方式尝试使用 after 验证挂钩来做到这一点,但它不起作用:

protected function getValidatorInstance()

    $validator = parent::getValidatorInstance();

    if ($validator->fails()) 
        \Log::info($validator->errors());

        $msg = $validator->errors();
        $status = Status::ERROR;

        return response()->json(['response' => [
            'status' => $status,
            'msg' => $msg,
        ]]);
    

    return $validator;

代码在return response() 上失败,说Method passes does not exist (Illuminate/Support/Traits/Macroable.php:96)。

有谁知道这似乎是什么问题?

【问题讨论】:

【参考方案1】:

从 Laravel 5.x 版本(不确定)开始,failedValidation() 方法被引入到表单请求中,而不是 Laravel 4.x 中的 response()

我通过在我的表单请求中覆盖该方法来定制响应以解决我的问题:

public function failedValidation(Validator $validator)

    if ($validator->fails()) 
        $status = Status::ERROR;
        throw new HttpResponseException(response()->json(["response" => [
            'msg'    => $validator->errors()->all(':message'),
            'status' => $status
        ]]));
    

    return response()->json(["response" => [
        'msg'    => 'User successfully registered',
        'status' => Status::SUCCESS
    ]]);

【讨论】:

以上是关于Laravel 自定义验证和 ajax的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 自定义多重身份验证

Laravel 5.5 / 验证器 / 自定义规则

Laravel 5.5 的自定义验证对象/类

两个日期的 Laravel 自定义验证

如何自定义 laravel 数组验证错误键和消息

laravel5.4中自定义ajax请求响应类