SQL极简教程 · MySQL · MyBatis · JPA 技术笔记 教程 总结PHP开发PHP经验分享

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

2020-05-26  本文已影响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、这里也可以捕获到中间件的异常

上一篇下一篇

猜你喜欢

热点阅读