ThinkPHP6.x表单校验核心是定义独立验证器类、实例化后调用check()方法;需确保字段名、数据键名、HTML name属性三者一致,支持场景切换、批量错误收集及自定义规则。

ThinkPHP 使用验证器校验表单数据,核心是定义验证规则、创建验证器实例、调用 check() 方法进行校验,并根据结果处理逻辑。5.x 和 6.x 写法略有不同,以下以更主流的 ThinkPHP 6.x 为例说明(兼容性好、文档完善)。
定义验证器类
推荐使用独立的验证器类(非闭包),便于复用和维护。在 app\validate 目录下新建文件,如 UserValidate.php:
namespace app\validate;
use think\Validate;
class UserValidate extends Validate
{
protected $rule = [
'username' => 'require|alphaNum|min:3|max:16',
'email' => 'require|email',
'password' => 'require|min:6',
'age' => 'number|between:1,120',
];
protected $message = [
'username.require' => '用户名不能为空',
'username.alphaNum' => '用户名只能是字母和数字',
'username.min' => '用户名最少3个字符',
'email.require' => '邮箱不能为空',
'email.email' => '邮箱格式不正确',
'password.require' => '密码不能为空',
'password.min' => '密码至少6位',
'age.number' => '年龄必须为数字',
'age.between' => '年龄必须在1到120之间',
];
protected $scene = [
'register' => ['username', 'email', 'password'],
'update' => ['username', 'email', 'age'],
];
}
在控制器中调用验证器
获取表单数据后,实例化验证器并执行校验,失败时可直接返回错误信息:
- 方式一:手动实例化 + check()
use app\validate\UserValidate;
public function register()
{
$data = $this->request->post();
$validate = new UserValidate();
if (!$validate->scene('register')->check($data)) {
return json(['code' => 0, 'msg' => $validate->getError()]);
}
// 校验通过,继续业务逻辑(如入库)
return json(['code' => 1, 'msg' => '注册成功']);
}
- 方式二:使用助手函数
validate()(更简洁)
public function register()
{
$data = $this->request->post();
$result = $this->validate($data, 'app.validate.UserValidate.register');
if (true !== $result) {
return json(['code' => 0, 'msg' => $result]);
}
// 处理成功逻辑
return json(['code' => 1, 'msg' => '注册成功']);
}
支持批量验证与自定义规则
默认单条失败即停止(快速失败),如需收集所有错误,开启 batch 模式:
立即学习“PHP免费学习笔记(深入)”;
$validate = new UserValidate();
$validate->batch(true); // 开启批量验证
$result = $validate->scene('register')->check($data);
if (true !== $result) {
// $result 是包含全部错误信息的数组,如 ['username' => '...', 'email' => '...']
return json(['code' => 0, 'msg' => '校验失败', 'error' => $result]);
}
如需复杂逻辑(如“密码和确认密码一致”),可在验证器中定义自定义方法:
protected $rule = [
'password' => 'require|min:6',
'repassword' => 'require|confirm:password', // 内置 confirm 规则
'mobile' => 'require|isMobile', // 调用 isMobile() 方法
];
// 自定义方法
public function isMobile($value, $rule, $data)
{
return preg_match('/^1[3-9]\d{9}$/', $value) === 1;
}
注意点与常见问题
- 验证器类名需与文件名一致,且首字母大写(如
UserValidate.php→UserValidate) - 场景(
scene)用于按用途筛选字段,避免一个验证器承担过多职责 -
$this->request->post()获取的是已过滤的 POST 数据;若需原始数据(如含 HTML),用$this->request->post(null, null, false) - 验证器不自动处理空格、trim 等,可在规则前加
trim|,或在验证前手动处理 - ThinkPHP 5.1+ 支持注解验证(配合模型),但独立验证器仍是表单校验最清晰的方式



















