laravel引入formRequest类后,自定义规则输出

作者: 怀老师 | 来源:发表于2020-05-26 23:01 被阅读0次

    场景:在使用了Laravel的formRequest后,因为是直接注入的,所以报错不能在当前方法内捕获,也就无法返回一个规范的报错形式。

    先上解决方法

    1、在继承formRequest类的自定义Request类中重写方法

       public function rules()
        {
            //身份证正则验证
            $rules =  [
                'id_card' => 'required|regex:/^[1-9]\d{14}(\d{2}[0-9X])?$/'
            ];
            return $rules;
        }
       public function messages()
        {
            //自定义报错
            return [
                'id_card.regex'=>'身份证格式不正确',
            ];
        }
    

    2、使用app/Exception/Handler.php

        public function render($request, Exception $exception)
        {
            //如果异常继承了表单验证类,则自定义返回报错
            if ($exception instanceof ValidationException) {
                //这里可以返回first,也可以返回all(),根据自己需要返回,想起支持的方法请查看laravel的MessageBag类
                return response()->json(['code'=>1005,'message'=>$exception->validator->errors()->first(),'extra'=>[]]);
            }
            return parent::render($request, $exception);
        }
    

    再说解决过程

    1、首先我去找了FormRequest的类定义,查找其中可供使用的属性和可重写的方法。
    2、发现可以对FormRequest类中的failedValidation方法进行重写并进行try catch

         protected function failedValidation(Validator $validator)
        {
             try{
                parent::failedValidation($validator);
            }catch(\Exception $e){
                //todo处理
            }  
        }
    

    3、可惜这里catch后,可以打印到exception对象,但是做的return不生效
    4、这时就开始转换思路,思考能否全局捕获
    5、然后在官方文档就搜到了全局异常的捕获方法
    6、问题解决,但思路比结果重要
    7、这里也可以捕获到中间件的异常

    相关文章

      网友评论

        本文标题:laravel引入formRequest类后,自定义规则输出

        本文链接:https://www.haomeiwen.com/subject/bovbahtx.html