thinkphp5/6验证器必须用独立类承载规则,路径、命名、命名空间须严格匹配框架规范,字段名、规则、提示需点号精确对应,批量验证需链式调用batch(true)并正确处理数组错误,自定义方法签名不可缺参数,校验失败须用$this->fail()而非throw。

ThinkPHP5 验证器不能靠 $this->validate() 传数组硬写规则应付,必须用独立验证器类承载规则、提示、场景和自定义逻辑——否则字段一多、条件一嵌套,getError() 就返回空,或者只报第一个错就停了。
验证器类必须放对路径且命名严格匹配
框架不会扫描任意目录。错放位置或类名不一致,直接 Class not found 或静默走默认验证。
- 标准路径是
application/validate/User.php(TP5 默认)或app/validate/User.php(TP6+),别塞进app/common/或app/library/ - 文件名必须和类名完全一致:文件叫
User.php,类就必须是class User extends \think\Validate - 命名空间必须为
app\validate(TP6)或application\validate(TP5),多应用模式下要加前缀,如app\api\validate
$rule 和 $message 必须用点号严格配对
字段名、规则后缀、大小写、空格,差一个字符,getError() 就拿不到提示。
-
$rule['email'] = 'require|email'对应的提示必须是$message['email.require']和$message['email.email'],不能写成'email' => '邮箱格式错误'(这只会触发默认提示) - 字段名必须和传入数据的键完全一致:
$data['user_email']就得写'user_email' => 'email',不是'email' - 自定义正则要用
regex规则,提示必须写成'mobile.regex',漏掉.regex后缀,提示就丢
批量验证 batch(true) 要链式调用且处理返回值
开了 batch(true) 却还是只看到一个错误?大概率是调用顺序或返回值处理错了。
- 必须在
check()前链式调用:(new User())->batch(true)->check($data),而不是(new User())->check($data)->batch(true)(check()已执行,再调没用) -
batch(true)后getError()返回的是数组,不是字符串;$this->error($validate->getError())会报错,得自己implode('', $validate->getError()) - 性能注意:批量验证会跑完所有字段所有规则,高并发表单慎用;默认「短路模式」更省资源
自定义方法签名和调用方式不能错
写了 checkEmailUnique() 却提示 method not exists?不是函数没写,是签名或可见性不对。
- 必须声明为
public function checkEmailUnique($value, $rule = '', $data = [], $field = ''),少一个参数、顺序错、类型不匹配,check()内部调用直接失败 - 函数里不要
throw new Exception(),要用$this->fail('提示信息')主动中断,否则流程不可控 - 需要读其他字段(比如确认密码比对),从
$data里取:$data['password_confirm'],别另起input()或request
最常被忽略的其实是字段名与数据键的映射一致性——POST 是 ['user_name' => 'foo'],规则就得写 'user_name' => 'require',而不是凭经验写成 'username';嵌套结构如 profile[phone] 还得先转成 PHP 数组再验证,规则用通配符 'profile.*.phone',这些细节一错,整个验证就失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











