验证器不会自动运行,必须显式调用check()或通过框架门面/控制器触发;validate()是静态方法,不读取实例规则,正确做法是$v->check($data)或validate(uservalidate::class)->check($data)。

验证器不会自动运行,必须显式调用 check() 或通过框架门面/控制器方法触发;不调用就等于没写规则。
为什么 new 了验证器却没报错?
常见现象:写了 $v = new UserValidate(); $v->validate($data);
结果始终返回 true 或直接报错 Class not found —— 因为 validate() 是静态方法,它不读取实例的 $rule,而是新建一个空 Validate 实例去校验,和你的 UserValidate 完全无关。
- 正确做法是调用实例的
check():$v->check($data) - 若用门面方式,必须走
validate(UserValidate::class)->check($data),不能只写validate()->check() - 手动创建类时,确保命名空间是
app\validate、文件路径是app/validate/UserValidate.php,否则Class not found - 验证器类必须继承
think\Validate,且$rule字段名要和传入数据的键名严格一致(区分大小写)
场景(scene)为什么没生效?
写了 protected $scene = ['edit' => ['id', 'username']],但 $v->check($data) 还是校验了所有字段 —— 因为 scene 不是默认启用的,必须主动调用 scene('edit') 才会加载对应白名单。
- 不调
scene(),哪怕定义了也等于没写 - 场景名大小写敏感:
'Edit'和'edit'是两个不同场景 - 控制器中用
$this->validate($data, 'UserValidate.edit')时,点号是硬性语法,不能替换成下划线或斜杠 - 想在编辑时去掉密码校验、加上昵称,推荐用
scene('edit')->append(['nickname'])->remove(['password']),而不是只写only(),避免漏掉主键等关键字段
批量验证(batch)为什么 getError() 报错?
开了 batch(true) 后 echo $v->getError() 直接崩溃 —— 因为此时 getError() 返回的是关联数组,不是字符串。
- 默认是短路模式:第一个错误就停,
getError()返回字符串 - 开启批量后,必须自己处理返回值:
implode(';', $v->getError())或传给前端时保持数组结构 - 控制器里设
protected $batchValidate = true只对$this->validate()生效,对new UserValidate()无效 - 门面方式开启 batch:
validate(UserValidate::class)->batch(true)->check($data)
上传文件怎么验证 size 和扩展名?
validate(['file' => 'require|fileSize:2097152']) 一定失败 —— 普通 Validate 实例不识别 fileSize 规则,它只认字符串/数值字段。
- TP 6.x 正确做法:手动构造文件信息数组,字段名必须是
tmp_name、size、extension$data = [ 'tmp_name' => $_FILES['avatar']['tmp_name'], 'size' => $_FILES['avatar']['size'], 'extension' => pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION), ];
再传给Validate实例,并使用fileSize、fileExt等内置规则 - TP 5.1 可用
think\FileValidate,但它只认size和ext键,不接受嵌套或别名 - 别在规则里写
'avatar.size' => 'between:0,2097152',FileValidate 只解析顶层键
最常被忽略的一点:路由参数(如 /user/123 中的 123)不会自动进 $data,必须用 $this->request->route('id') 显式提取并拼入验证数据,否则 exists、number 这类规则根本没机会执行。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











