TP6.1验证器在TP8.0下不兼容,需重写为继承think\Validate的独立类,禁用动态实例化与数组规则,改用命令行生成、显式校验,强化类型语义,错误改抛ValidateException。

不兼容,TP6.1 的验证器代码在 TP8.0 下基本无法直接运行,核心规则语法、调用链、错误结构和类型校验逻辑全部变更。
验证器类定义和生成方式必须重写
TP6.1 支持 new \think\Validate() 动态实例化或控制器内数组规则;TP8.0 彻底禁用该方式,所有验证逻辑必须封装为继承 think\Validate 的独立类,并通过命令行生成:
- 执行
php think make:validate User生成app/validate/User.php - 手动迁移需补全命名空间:
namespace app\validate;和use think\Validate; -
$rule必须定义为类属性(数组),不再支持$validate->rule()链式设置
规则语法中 number/require/in 等行为已强化类型语义
TP8.0 默认启用强类型校验,许多看似“只是加个规则”的写法会静默失效:
-
require对null、空字符串、0均视为不满足;若需兼容旧逻辑,改用notEmpty或显式白名单如['require', '0'] -
in:1,2,3默认将输入转为字符串比对,数字字段必须加number前缀:'status' => 'require|number|in:1,2,3' -
confirm规则必须显式指定对比字段:'password_confirm' => 'confirm:password',不能只写'confirm' - 数组规则写法废弃:
['name', 'require|alphaNum', '用户名']失效,必须改为键值对:'name' => 'require|alphaNum',提示单独配'name.require' => '用户名不能为空'
错误获取与批量校验逻辑彻底重构
TP6.1 的 getError() 返回字符串或一维数组,TP8.0 统一抛出 ValidateException 异常,且默认不返回聚合错误:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
- 不再有
$validate->getError()直接取字符串的用法;必须try/catch ValidateException,再从异常中提取$e->getError() -
batch(true)不再是方法调用,而是check($data, [], ['batch' => true])的选项参数 - 开启
batch后,一个字段多个规则失败时只返回第一条错误消息——但字段名必须与$data键名完全一致(大小写、下划线),否则该字段被跳过,错误数组里根本不会出现这个 key - 调试时建议打印
$validator->getRuleNames(),确认当前生效字段是否与提交数据键名对齐
唯一性验证(unique)排除 ID 的写法不通用
TP6.1 用数组传参:['unique:users,email,' . $id . ',id'];TP8.0 推荐键值对写法,且更严格:
- 必须写成:
'email' => ['unique' => 'users,email,id^' . $id] - 主键非
id时不能省略字段名,例如:'email' => ['unique' => 'users,email,user_id^' . $id] - 禁止在规则字符串里拼
$_POST['id'],未过滤可能引发 SQL 注入;ID 应由控制器传入闭包或显式组装规则 - 联合唯一等复杂场景,TP8.0 不再支持原生扩展语法,必须改用
callback自定义验证并手写Db::name()->where()
最易被忽略的是:TP8.0 验证器默认开启 strict_types=1,所有验证器类文件顶部必须加 declare(strict_types=1);,否则 integer、float 等规则的类型转换行为会与预期不符,且 PHP 8.5+ 环境下可能直接报错中断。


















