Laravel如何返回自定义验证类的错误消息并展示给用户
自定义类中返回验证错误的实现方法
完全可以实现,和控制器内写验证的错误展示效果完全一致,常用两种实现方案:
方案1:抛Laravel原生验证异常(推荐)
Laravel全局自带ValidationException异常捕获机制,只要抛出这个异常,框架会自动把错误信息闪存到session的$errors变量中,自动重定向回提交页,和你平时调用Validator门面验证失败的处理逻辑完全一致,不需要修改前端已有的错误展示代码。如果是AJAX请求,框架也会自动返回422状态码和JSON格式的错误信息,不需要额外写适配逻辑。
修改自定义类代码如下:
namespace App\Classes; use Illuminate\Validation\ValidationException; class MyTestClass { public function myCustomValidation($a = null, $b = null) { if (empty($a)) { throw ValidationException::withMessages([ 'custom_field' => 'error 1' // 数组键名可自定义,对应前端取错误的字段标识 ]); } elseif (empty($b)) { throw ValidationException::withMessages([ 'custom_field' => 'error 2' ]); } else { return $a + $b; } } }
控制器原有逻辑不需要额外加判断,正常调用即可:
public function store() { $customStuff = new MyTestClass(); $variable = $customStuff->myCustomValidation(5); return view('test.index', compact('variable')); }
Blade模板中正常读取错误信息即可:
@if ($errors->any()) <div class="alert"> @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach </div> @endif
方案2:返回结构化结果手动处理
如果需要灵活控制错误处理逻辑,可以让自定义方法返回带状态标识的结构化数据,在控制器中判断结果后手动返回带错误的重定向:
修改自定义类方法:
namespace App\Classes; class MyTestClass { public function myCustomValidation($a = null, $b = null) { if (empty($a)) { return [ 'is_valid' => false, 'msg' => 'error 1' ]; } elseif (empty($b)) { return [ 'is_valid' => false, 'msg' => 'error 2' ]; } else { return [ 'is_valid' => true, 'data' => $a + $b ]; } } }
控制器中增加结果判断逻辑:
public function store() { $customStuff = new MyTestClass(); $checkResult = $customStuff->myCustomValidation(5); if (!$checkResult['is_valid']) { return back()->withErrors(['custom_field' => $checkResult['msg']]); } return view('test.index', ['variable' => $checkResult['data']]); }
两种方案最终前端展示效果完全一致,第一种代码更简洁,不需要在多层调用时重复写判断逻辑,只要是Laravel框架的HTTP请求生命周期内抛出的
ValidationException都会被自动处理,适配控制器、服务层、自定义类等所有场景。
内容的提问来源于stack exchange,提问作者Klapsius
相关产品推荐
相关产品推荐

