验证规则须定义在独立验证器类中,字段名须与$data键完全一致,推荐数组格式定义规则;自定义规则方法需public且四参数签名;geterror()返回字符串,geterrors()返回结构化数组。

验证规则必须写在独立验证器类里,不能塞进控制器;错误信息不自动显示,必须显式调用 getError() 或 getErrors() 才能拿到。
验证器类怎么定义规则才不会失效
字段名必须和提交的 $data 数组键完全一致——比如前端传的是 {"user_email": "a@b.com"},规则却写 'email' => 'require|email',那 email 字段根本不存在,验证直接跳过。
- 推荐用数组格式定义规则,可读性高、易扩展:
protected $rule = ['user_email' => ['require', 'email'], 'password' => ['require', 'min:6']] - 点号语法支持嵌套校验(如
'profile.phone' => 'mobile'),但前提是$data['profile']['phone']确实存在 - 别混用字符串和数组规则写法——
'name' => 'require|max:20'和'name' => ['require', 'max' => 20]同时出现,可能导致部分规则被忽略 - 条件规则如
requireIf:other_field,value中的other_field是字段名(字符串),不是值,别写成requireIf:status,1这种硬编码
自定义验证规则为什么总报 Method not exist
ThinkPHP 6 要求自定义规则方法必须是 public,且签名严格为四个参数:($value, $rule, $data, $field)。写成 protected function checkMobile() 或少一个参数,check() 内部反射调用就会失败。
- 方法命名建议带
rule前缀,如public function ruleMobile($value, $rule, $data, $field),规则里直接写'phone' => 'ruleMobile' - 如果想全局复用,用
Validate::extend('mobile', [$this, 'ruleMobile'])注册,注意回调必须能被反射调用 - 别在方法里
throw new Exception(),应返回false并设置$this->error = '提示信息',否则中断流程且无法进入getErrors() - 避免与内置规则同名(如
date、alpha),否则会被优先匹配内置逻辑,自定义方法压根不执行
错误信息怎么取才对:字符串还是数组?
getError() 返回字符串(如 "用户名不能为空;邮箱格式不正确"),专为模板输出设计;getErrors() 才返回结构化数组(如 ['username' => '用户名不能为空', 'email' => '邮箱格式不正确']),这才是前端按字段渲染的正确来源。
- 验证失败后,必须立刻调用
$validate->getError()或$validate->getErrors(),不取就丢——框架不会自动抛异常或注入到响应中 - 用了
scene()就得先$validate->scene('login')再->check($data),否则getErrors()可能为空 - 中文乱码大概率是验证器 PHP 文件本身编码不是 UTF-8,或 Windows 记事本保存引入了 BOM
- 闭包规则(如
'status' => function($value) { return in_array($value, [0,1]); })无法自动绑定字段名,getErrors()可能返回空数组,慎用
场景(scene)切换后验证不生效怎么办
scene 不是持久状态,每次验证前都必须重新设置——写成 $validate->scene('edit')->check($data) 没问题,但如果中间穿插了其他操作再复用同一个实例,必须再次 ->scene('add'),否则仍走上次的规则集。
-
scene定义的是“该场景下允许验证哪些字段”,不是“只校验这些字段”——未列出的字段不会被校验,但也不会报错 - 字段别名靠规则里的竖线语法实现,如
'user_email|邮箱' => 'require|email',这样getError()会自动把“邮箱”代入提示 - 批量返回所有错误要用
$validate->batch()->check($data),否则默认只返回第一条失败规则的提示 - 数据库查询类自定义规则(如检查邮箱是否已存在)务必用
app(User::class)->where(...)获取模型,别new User(),否则破坏容器管理和事务上下文
最常被忽略的一点:验证器类文件必须保存为 UTF-8 无 BOM 格式,且 scene 必须在 check() 前调用——这两个小细节出问题,整个验证流程就静默失效了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











