ThinkPHP 6.0 表单验证依赖 Validate 类,需显式调用、指定场景、手动处理错误;规则定义在 $rule 数组或 rules() 方法中,字段名须与提交数据键一致,支持别名、提示语定制、scene 白名单控制、联动/条件校验及 Ajax 下手动返回 JSON。

ThinkPHP 6.0 的表单数据验证核心靠 Validate 类实现,不是写一堆 if 判断,而是通过规则声明 + 场景控制 + 手动触发来完成。关键在于:验证器必须显式调用、场景必须指定、错误需手动处理——框架不会自动返回 JSON 或跳转。
定义验证器类并写入规则
在 app/validate/ 下新建 PHP 文件(如 UserRegisterValidate.php),继承 think\Validate:
- 规则必须写进
protected $rule数组或rules()方法中,否则不生效 - 字段名要和提交数据的键完全一致,比如表单里是
username,规则里就不能写成user_name - 别名用竖线分隔:
'email|邮箱' => 'require|email' - 提示语格式为
"字段名.规则名",例如'email.require' => '邮箱不能为空'
用 scene 控制校验字段范围
不同操作(注册、编辑、重置密码)需要校验不同字段,靠 scene 实现白名单管理:
- 在验证器类中定义方法,如
sceneRegister(),返回$this->only(['username', 'password', 'confirm_password']) - 控制器中必须显式调用:
$v->scene('register')->check($data),不加scene()就按空场景跑,所有规则失效 - 也可直接用字符串方式:
$this->validate($data, 'UserRegisterValidate.register'),前提是控制器继承think\Controller
处理联动与条件校验
默认规则无法覆盖“两次输入密码一致”“仅当 status=1 时才校验 reason”这类逻辑:
- 跨字段比对(如密码确认):在
scene方法中调用→append('confirm_password', 'confirmPassword'),再在验证器里写protected function confirmPassword($value, $rule, $data, $field)方法 - 条件依赖:用
['status' => 'requireIf:status,1']或自定义方法判断$data['status'] === '1'再决定是否校验 - 数组项逐条校验:字段名写成
tags.*,规则如'tags.*' => 'max:20|alphaNum'
Ajax 提交时的特殊处理
表单走 Ajax 时,验证失败不会自动吐 JSON,容易卡在空白页或 400 错误:
- 别用
$this->validate()魔术方法,改用Validate实例的check()方法 - 手动构造响应:
return json(['code' => 0, 'msg' => (string)$validate->getError(), 'data' => []]) - 确保前端带了
__token字段(用{:token()}渲染),否则请求会在验证前就被拦截 - 批量收集错误可启用
$validate->batch(true),getError()返回数组而非字符串
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











