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 协议》,转载必须注明作者和本文链接
每天进步一点点
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
jaak

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

5年前 评论

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

5年前 评论
jaak

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

5年前 评论

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