thinkphp validate门面不自动校验,必须显式调用check()或用validate()辅助函数传参;需确保数据为关联数组、规则字段名严格一致,批量验证须手动开启batch(true),json请求需手动解析php://input。

Validate门面不自动校验,必须显式调用 check() 或用 validate() 辅助函数传参才能触发验证逻辑。
门面调用的两种写法必须带数据和规则
ThinkPHP 的 Validate 门面(think\facade\Validate)本质是工厂类,它返回验证器实例但不执行校验。常见错误是只写 Validate::make(...) 或 validate(UserValidate::class) 就以为完事了——这只会得到一个空载实例,check() 没被调,验证静默跳过。
- 正确方式一(动态规则):
Validate::make(['name' => 'require|max:20'], $data)->check() - 正确方式二(复用验证器类):
validate(UserValidate::class)->check($data) - 若需场景验证,点号分隔不能省:
validate(UserValidate::class)->scene('edit')->check($data) - 传入的
$data必须是关联数组,键名要和验证器$rule中字段名完全一致(大小写、下划线、中英文冒号都算错)
批量错误收集必须手动开启 batch(true)
默认情况下,验证遇到第一个错误就终止,getError() 返回字符串;前端如果只预留了一个 msg 字段,直接塞进 JSON 会出错。要拿到全部字段错误,得提前开批量模式。
- 门面方式开启:
validate(UserValidate::class)->batch(true)->check($data) - 失败后
getError()返回的是关联数组,如['email' => '邮箱格式错误', 'username' => '用户名已存在'] - 前端兼容处理建议:
implode(';', $validate->getError())或按字段映射到表单元素 - 注意:
protected $batchValidate = true在 BaseController 里声明,对门面调用无效,只影响$this->validate()这种控制器基类方法
JSON 请求体数据要手动读取,不能依赖 input()
API 接口常用 Content-Type: application/json,此时 $request->param() 和 input() 都拿不到数据,因为 PHP 不自动解析 JSON 到 $_POST。
- 必须手动读取原始输入:
$json = json_decode(file_get_contents('php://input'), true) ?: [] - 再传给门面:
Validate::make(['id' => 'number', 'title' => 'require'], $json)->check() - 如果规则里用了
exists或unique,确保数据库连接正常、表名字段名拼写无误,TP8.1+ 已默认支持这些规则,无需额外配置 - 别在
make()前用input('xxx')混合取值——来源不统一容易漏字段或类型错乱
最容易被忽略的是:门面返回的对象没有“记忆”,每次调用 check() 都是全新上下文;想复用规则+消息+场景,优先用验证器类实例化,而不是反复调用门面构造。另外,regex 规则在 TP8+ 必须带锚点 ^ 和 $,写成 regex:1[3-9]\d{9} 会匹配非法子串,务必写全 regex:^1[3-9]\d{9}$。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











