ThinkPHP 8.0新手入门:新版验证器(Validate)与场景化验证【说明】

雨丽姑娘_2679

雨丽姑娘_2679

2026-06-24

961人浏览

原创

thinkphp 8.0 注册接口验证需用场景(scene)精准控制字段校验:生成uservalidate类后,必须在$scene中显式声明各场景字段白名单(如'register'=>['name','email','mobile','password']),漏写即不校验;调用时须链式执行scene()→check(),否则场景失效。

thinkphp 8.0新手入门:新版验证器(validate)与场景化验证【说明】

你在写 ThinkPHP 8.0 的注册接口,发现用户提交的手机号、邮箱、密码字段在不同场景下要验不同的规则——注册时全都要,登录只要邮箱和密码,修改资料时又允许邮箱为空——但照着文档写完 $scene 却没生效,数据照样全量校验或直接跳过。

生成验证器类:别手敲,用命令行

打开终端,进入项目根目录,执行:
php think make:validate UserValidate

这会自动生成 app/validate/UserValidate.php 文件,含标准命名空间、继承声明和空的 $rule / $message / $scene 属性。手动创建极易出错:文件放错目录(比如丢进 app/controller)、命名空间写成 app\validate\user_validate(小写或下划线)、类名与文件名不一致(UserValidate.php 里写 class userValidate),都会触发 Class not found。

生成后立刻检查文件头三行是否为:
namespace app\validate;
use think\Validate;
class UserValidate extends Validate

定义规则和错误提示

在 UserValidate.php 的 $rule 属性中填入字段规则,例如:
protected $rule = [
  'name' => 'require|alphaNum|max:20',
  'email' => 'email',
  'mobile' => 'mobile',
  'password' => 'require|length:6,20'
];

注意:mobile 规则要求字段值必须在内置 mobile 验证范围内,即符合中国大陆手机号 11 位纯数字格式;若传入 138****1234 带星号或带空格,会直接失败。不要用正则替代,TP8 的 mobile 是强校验。

在 $message 中覆盖默认提示,让前端看得懂:
protected $message = [
  'name.require' => '用户名不能为空',
  'email.email' => '邮箱格式不正确',
  'mobile.mobile' => '手机号格式不正确',
  'password.length' => '密码长度需为6~20位'
];

配置多场景:register/login/edit 必须显式声明字段白名单

在 $scene 属性中定义三个场景,每个场景必须完整列出该场景下参与校验的所有字段名,哪怕规则和默认一样也要写进去:
protected $scene = [
  'register' => ['name', 'email', 'mobile', 'password'],
  'login' => ['email', 'password'],
  'edit' => ['name', 'email']
];

漏掉字段=不校验=也不保证它存在。比如 edit 场景没写 mobile,那即使用户 POST 了 mobile 字段,它也不会被校验;但如果你后续代码写了 $data['mobile'],就会触发 PHP Notice。这不是验证器的 bug,是设计使然——场景就是字段白名单,不是“排除列表”。

场景名大小写敏感,'Register' 和 'register' 是两个不同场景,调用时写错就走空场景(即全部字段)。

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

下载

控制器中调用验证器:三步不能少

方法一:门面方式(推荐)
① 在控制器方法顶部引入验证器类名字符串
② 调用 validate(UserValidate::class) 获取门面对象
③ 链式调用 → scene('register') → batch(true) → check($data)

完整示例:
try {
  $result = validate(UserValidate::class)->scene('register')->batch(true)->check($this->request->post());
} catch (\think\exception\ValidateException $e) {
  throw new \think\exception\HttpResponseException(json(['code' => 400, 'msg' => $e->getError()]));
}

方法二:手动实例化(适合需要动态改规则)
$v = new \app\validate\UserValidate();
$v->scene('login');
$pass = $v->check($data);
if (!$pass) {
  return json(['code' => 400, 'msg' => implode(';', $v->getError())]);
}

关键提醒:validate() 门面返回的是对象,不调 check() 就等于只拿了安检仪没按启动键;scene() 不调用就等于写了航班计划却不登机——字段白名单永远不会生效。

嵌套数组验证:items.*.name 这种写法默认无效

假设用户提交了地址数组:
$data = ['name' => '张三', 'addresses' => [['city' => '北京', 'code' => '100000'], ['city' => '上海']]];

想验证每个 address 的 code 是否为 6 位数字,不能写 rule['addresses.*.code'] = 'number|length:6'——TP8 默认 strict 模式关闭,通配符会被忽略。

正确做法分两步:
第一步:在 $rule 中声明 addresses 字段类型为 array:
'addresses' => 'array'

第二步:启用 strict 模式并在验证器类中添加自定义方法:
$this->strict(true); // 放在构造函数或 check 前
public function checkAddressCode($value, $rule, $data, $field) {
  if (!isset($data['addresses']) || !is_array($data['addresses'])) return true;
  foreach ($data['addresses'] as $i => $addr) {
    if (!isset($addr['code']) || !preg_match('/^\d{6}$/', $addr['code'])) {
      $this->fail("第{$i}个地址邮编格式错误");
      return false;
    }
  }
}

然后在 $rule 中绑定:'addresses' => 'array|checkAddressCode'

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

0

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

80

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

100

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

300

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

180

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程