直接用think\Validate实例化并传入规则和提示数组即可快速校验,如new \think\Validate(['username'=>'require|min:2'], ['username.require'=>'用户名必填']),再调check($data),失败时用getError()获取错误信息。

直接用 validate 辅助函数或 think\Validate 类实例化就能做表单校验,不用写验证器类也能跑通;但想复用、维护和扩展,必须抽成独立验证器类。
怎么快速用内置验证器做一次校验(不建类)
适合临时验证、调试或极简接口,省去类文件创建步骤:
- 用
think\Validate实例化时直接传入规则数组和提示数组,比如:$validate = new \think\Validate([ 'username' => 'require|min:2|max:16', 'email' => 'require|email', 'password' => 'require|min:6' ], [ 'username.require' => '用户名不能为空', 'email.email' => '邮箱格式不正确' ]); -
$data = input('post.')获取全部 POST 数据,再调$validate->check($data);失败就用$validate->getError()拿错误字符串(注意:默认只返回第一个错误) - 如果要一次性收集所有字段的错误,加
batch():$validate->batch()->check($data),此时getError()返回的是数组 - 规则里支持
token,但前提是模板中已输出{:token()}或手动带了__token__字段,否则会直接报“令牌错误”
为什么建议一定要建独立验证器类
因为规则和提示硬编码在控制器里,很快就会失控——改个提示要翻三四个控制器,加个新字段得同步五处 new Validate(...) 调用。
- 类路径按约定放在
app\validate\User.php,继承\think\Validate -
$rule里写规则,$message里写提示,键名必须是字段名.规则名格式,比如'password.min',漏掉点或写错大小写都拿不到提示 - 场景验证(如注册 vs 编辑)靠
$scene属性定义,控制器里用$validate->scene('register')->check($data)切换,避免把所有规则堆一起 - 别忘了在控制器里用
use app\validate\User;,否则new User()会报类未找到
check() 返回 false 但 getError() 是空的?常见原因
这是最让人卡住的问题,不是代码写错了,而是验证器没生效或被绕过了。
立即学习“PHP免费学习笔记(深入)”;
- 数据字段名和
$rule里的键对不上:比如表单提交的是user_name,但规则写的是'username' => 'require',那就永远不触发 - 用了
input('post.')却没过滤掉空格或前后换行,导致trim()没做,require判定为非空但其实是空白字符串 - 规则里写了
email,但传入的是null或未定义字段,check()默认跳过该字段(除非加isset或notNull规则) - PHP 版本高于 7.4 且开启严格模式时,
getError()在未触发任何规则时可能返回null而非空字符串,判断时别只写if (!$validate->getError()),应判=== false或用is_string()
token 验证总失败?重点检查这三点
表单令牌不是可选功能,它是防重复提交和 CSRF 的基础防线,但配置错一点就全挂。
- 模板里必须有
{:token()}或显式写<input type="hidden" name="__token__" value="{$Request.token}">,不能只靠 JS 拼接 - 验证规则里任意一个字段加
|token即可,比如'username' => 'require|token',不需要每个字段都加 - 如果自定义了令牌名称(如
__hash__),那模板的name和规则里的token:__hash__必须完全一致,包括大小写和下划线数量 - AJAX 提交时,
__token__值必须从页面 DOM 中实时读取(不能缓存),否则二次请求会因 session 中 token 已销毁而失败
真正麻烦的从来不是写几条规则,而是字段命名不统一、前后端约定模糊、token 生命周期没对齐——这些地方一出问题,getError() 就像哑巴一样不说话。



















