Laravel 5.5 中该怎么拦截表单校验失败重定向或者返回JSON的返回格式?

在 laravel 5.1 中 可以在 BaseController 中重写

/**
     * {@inheritdoc}
     */
    protected function buildFailedValidationResponse(Request $request, array $errors)
    {
         return new JsonResponse($errors);
    }

可以实现拦截$this->validate($request,$rules,$messages);方法的自动跳转
现在在 laravel 5.5 中没有了这个方法,现在该怎么修改?

阅读 8.1k
5 个回答

我自己回答这个问题吧,希望以后那些自己不能提出解决方案只会说教别人的嘴炮都闭嘴吧。
一. 仍然使用 控制器 中的$request->validate($rules);进行校验,在表单输入不合法的时候,会抛出一个throw new ValidationException();错误,可以在App\Exceptions\Handlerrender()方法中去捕获它

        if ($exception instanceof ValidationException) {
                    return new JsonResponse($exception->getMessage());
                }

二. 我们不使用 request 对象中的 validate 方法,自己构造一个验证

        $validator = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            return new JsonResponse($validator->getMessage());
        }

推荐使用第一个解决方案,仍然可以达到之前的效果,代码修改量也最小。

你可以尝试使用
protected $messages=[

'name.required'=>'名称必须',

];

5.1到5.5都更新了好多了好么...还想着用5.1版本的方法...好好看看5.5的文档吧

新手上路,请多包涵

楼主给的答案是正确的, 给5.5文档那位同学自己没有尝试过吧.
文档中虽然写了针对Ajax请求会返回json对象并且发送422状态码,但实际上异常类并没有针对Ajax请求做额外处理,需要像楼主一样手动添加处理到handler中.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏