Laravel POST 请求 API 接口,使用自定义表单验证,验证失败跳转回首页的问题记录

这个问题是因为 FormRequest 中在验证规则失败时,会调用 failedValidation 方法,该方法的代码:

/**
 * Handle a failed validation attempt.
 *
 * @param  \Illuminate\Contracts\Validation\Validator  $validator
 * @return void
 ``*
 * @throws \Illuminate\Validation\ValidationException
 */
protected function failedValidation(Validator $validator)
{
    throw (new ValidationException($validator))
                ->errorBag($this->errorBag)
                ->redirectTo($this->getRedirectUrl());// 最终在这里会重定向
}

解决的方法是在自定义的表单验证类重写这个方法。

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

.
.
.

protected function failedValidation(Validator $validator)
{
    $error= $validator->errors()->all();
    throw new HttpResponseException($this->fail(400, $error));
}

protected function fail(int $code, array $errors) : JsonResponse
{
    return response()->json(
        [
            'code' => $code,
            'errors' => $errors,
        ]
    );
}
api
本作品采用《CC 协议》,转载必须注明作者和本文链接
每天进步一点点
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 5
jaak

你发送的post请求是ajax请求么,还是普通的form提交? 看你这应该是普通的form提交

4年前 评论

@jaak form表单提交,没使用 ajax

4年前 评论
jaak

使用 AJAX 来发送请求时,Laravel 并不会生成一个重定向响应,而是会生成一个包含所有验证错误信息的 JSON 响应。这个 JSON 响应会包含一个 HTTP 状态码 422 被发送出去

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!