You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何通过Ajax获取FormRequest的验证错误信息

在Laravel FormRequest中处理AJAX验证错误返回

你的问题出在failedValidation方法的实现上——当前你只是返回了一个错误数组,但Laravel并不会自动处理这个返回值,而是需要你主动抛出一个HttpResponseException来中断请求流程,返回自定义的JSON响应。

下面是修改后的CategoryRequest中的failedValidation方法,专门处理AJAX/JSON请求的验证错误:

public function failedValidation(Validator $validator)
{
    // 判断当前请求是否期望JSON响应(AJAX请求通常会满足这个条件)
    if ($this->wantsJson()) {
        // 构建自定义的JSON错误响应
        $response = new JsonResponse([
            'status' => 'error',
            'data' => $validator->messages()->getMessages()
        ], 422); // 422是Unprocessable Entity,适合验证错误的HTTP状态码

        // 抛出异常,让Laravel直接返回这个响应
        throw new HttpResponseException($response);
    }

    // 非AJAX请求,沿用默认的验证错误处理(比如重定向回表单并带错误信息)
    parent::failedValidation($validator);
}

为什么要这么做?

  • Laravel的FormRequest在验证失败时,默认会触发重定向(针对普通表单请求)或者返回默认的JSON错误(但格式可能不符合你的需求)。
  • 通过抛出HttpResponseException,你可以完全自定义错误响应的格式,同时保持代码的关注点分离——把验证相关的逻辑(包括错误返回)都封装在FormRequest类中,让控制器只处理业务逻辑。

额外注意点

  1. 你的控制器方法不需要做任何修改,当前的实现已经可以在验证通过时返回正确的JSON响应。
  2. $this->wantsJson()方法会检查请求的Accept头是否包含application/json,或者请求是否是AJAX(通过X-Requested-With头),比单纯的$this->ajax()更通用,能覆盖更多前端场景。
  3. 使用422状态码是RESTful API的最佳实践,明确告诉客户端这是请求数据验证失败的错误。

这样修改后,当AJAX请求触发验证错误时,前端就能收到你定义的{status: 'error', data: {...}}格式的响应,同时保持代码结构的清晰和职责分离。

内容的提问来源于stack exchange,提问作者Mohamed Elbiheiry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:02