thinkphp 8.0 表单验证核心是使用 validate 类,支持声明式规则、场景切换、错误定制和自动抛异常;可通过命令行生成验证器,配置 $rule 和 $message,并在控制器中调用 validate 方法校验数据。

ThinkPHP 8.0 实现表单数据验证,核心是用好验证器(Validate)类,而不是直接操作 $_POST 或手写 if 判断。它支持声明式规则、场景切换、错误定制和自动抛异常,开发效率高且不易漏校验。
定义验证器类
推荐用命令行快速生成:
- 运行
php think make:validate User,自动生成app/validate/User.php - 在类中配置
$rule和$message:
protected $rule = [
'username' => 'require|alphaNum|min:3|max:20',
'email' => 'require|email',
'password' => 'require|min:6',
];
protected $message = [
'username.require' => '用户名不能为空',
'username.alphaNum' => '用户名只能由字母和数字组成',
'email.email' => '邮箱格式不正确',
];
在控制器中调用验证
两种常用方式,推荐使用第一种(更简洁):
- 直接传验证器类名字符串:
$this->validate($data, 'User'); - 手动实例化并检查:
$validate = new \app\validate\User();<br>if (!$validate->check($data)) {<br> $this->error($validate->getError());<br>}
验证失败时会自动抛出 ValidateException,框架默认捕获并返回错误信息;也可主动调用 getError() 获取提示。
支持灵活的验证场景
同一张表单在新增、编辑时规则常不同,用 $scene 定义:
- 在验证器中添加:
protected $scene = [<br> 'add' => ['username', 'email', 'password'],<br> 'edit' => ['username', 'email']<br>];
- 控制器中指定场景:
$this->validate($data, 'User.edit');
配合表单令牌防重复提交
防止 CSRF 和误刷新提交,需三步联动:
- 模板中插入:
{:token()}(生成 hidden 输入框) - 路由或控制器启用 token 中间件:
protected $middleware = [\think\middleware\TokenCheck::class]; - 验证器本身不处理 token,但 token 校验会在请求进入控制器前完成,失败直接中断流程
注意:_token 值绑定当前 session,多标签页或长时间停留会导致“token error”,属正常行为,不是漏洞。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











