ThinkPHP 5.1 默认验证器单条失败即终止,启用 $batch = true 可批量验证并返回全部错误;调用 getError() 获取字段维度的多错误数组,支持场景验证且不可运行时修改。

ThinkPHP 5.1 默认验证器在调用 validate() 或 scene()->check() 时,遇到第一个失败规则就停止验证,只返回该条错误信息。若想一次性获取所有字段的全部错误,需手动启用批量验证模式。
开启批量验证(关键设置)
在定义验证器类时,通过设置 $batch = true 属性启用批量验证:
namespace app\validate;
use think\Validate;
class UserValidate extends Validate
{
protected $rule = [
'name' => 'require|length:2,10',
'email' => 'require|email',
'age' => 'number|between:1,120',
];
protected $message = [
'name.require' => '姓名不能为空',
'name.length' => '姓名长度为2-10个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'age.number' => '年龄必须为数字',
'age.between' => '年龄必须在1-120之间',
];
// ✅ 启用批量验证:所有规则全部执行,收集全部错误
protected $batch = true;
}
验证并获取全部错误信息
使用 check() 方法验证数据后,调用 getError() 即可拿到包含所有错误字段的关联数组:
$data = [
'name' => '', // 触发 require + length
'email' => 'abc', // 触发 email 格式错误
'age' => '150', // 触发 between 错误
];
$validate = new UserValidate();
$result = $validate->check($data);
if (!$result) {
$errors = $validate->getError(); // 返回完整错误数组
// 结果示例:
// [
// 'name' => ['姓名不能为空', '姓名长度为2-10个字符'],
// 'email' => ['邮箱格式不正确'],
// 'age' => ['年龄必须在1-120之间']
// ]
dump($errors);
}
配合场景(scene)仍有效
即使使用了验证场景,只要验证器类中设置了 $batch = true,场景验证也支持批量收集错误:
立即学习“PHP免费学习笔记(深入)”;
- 定义场景:
protected $scene = ['register' => ['name', 'email', 'age']]; - 调用方式:
$validate->scene('register')->check($data) - 错误仍按字段聚合,未被场景过滤的字段不会参与验证,已包含的字段错误全量返回
注意事项
-
$batch = true是验证器类级别配置,不可运行时动态修改 - 错误信息结构为
['字段名' => ['错误1', '错误2']],适合前端按字段展示多条提示 - 若需自定义错误格式(如扁平化为一维数组),可在获取
getError()后自行处理 - 注意与
failException配合:批量模式下即使出错也不会抛异常,仍需手动判断check()返回值



















