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、这里也可以捕获到中间件的异常