Laravel自定义扩展验证器如何返回精准自定义错误信息?
解决Laravel自定义数组验证器返回精准错误信息的问题
我来帮你搞定这个需求——原来的自定义验证器只返回布尔值,没法传递具体的错误细节,咱们可以通过操作主验证器的错误集合来实现精准提示。下面是具体的实现方案:
修改自定义验证器逻辑
核心思路是:在遍历校验每个商品时,如果发现错误,就把商品编号+具体字段错误的信息手动添加到主验证器的错误集合里,而不是只返回false。
修改后的扩展验证器代码如下:
Validator::extend('invoiceGoods', function($attribute, $value, $parameters, $validator) { $rulesForGoods = [ 'no' => 'integer|required', 'name' => 'string|max:64|required', 'unit' => 'required|integer', 'qty' => 'required|string', 'price' => 'required|numeric', 'amount' => 'required|numeric', 'vat_percent' => 'nullable|numeric', 'vat_sum' => 'nullable|numeric', 'total_sum' => 'required|numeric' ]; foreach ($value as $good) { // 注意:这里创建子验证器时不要覆盖主$validator变量 $itemValidator = Validator::make($good, $rulesForGoods); if ($itemValidator->fails()) { // 获取当前商品的编号,如果没有则用"未知"兜底 $goodsNo = $good['no'] ?? '未知'; // 遍历子验证器的所有错误,构造精准提示并添加到主验证器 foreach ($itemValidator->errors()->all() as $error) { $customError = "编号为{$goodsNo}的商品:{$error}"; $validator->addError($attribute, $customError); } // 返回false终止后续验证 return false; } } return true; });
为什么这样可行?
自定义验证闭包的第四个参数$validator就是主验证器的实例,我们可以调用它的addError方法直接向错误集合中添加自定义信息。这样当主验证器调用fails()时,返回的errors()里就包含了咱们构造的精准提示,比如:编号为1的商品:unit必须是整数。
主验证代码保持不变
你的主验证逻辑不需要修改,依然可以像之前那样返回错误响应:
$validator = Validator::make($data , [ 'goods' => 'invoiceGoods', 'sender_name' => 'string', 'recipient_name' => 'string', ]); if ($validator->fails()) { return response()->json([ 'success' => false, 'message' => 'Validation error.', 'data' => $validator->errors() ]); }
这样返回的错误数据里就会包含类似["goods" => ["编号为1的商品:unit必须是整数"]]的精准提示了。
内容的提问来源于stack exchange,提问作者Василий Пупкин
相关产品推荐
相关产品推荐

