TP8升级后需调整四方面:①分页用withQuery()替代appends()保留方括号;②正则验证器须加定界符、u修饰符及双反斜杠;③字符转换启用mb_detect_encoding严格模式;④分页返回改用items()和total()等方法适配新结构。

TP6升8后$_GET参数方括号丢失怎么办
TP6 升级到 TP8 后,带嵌套结构的查询参数(如 filter[status]=1、sort[by]=name)在分页 appends() 时大概率变成 filter=[status]=1 或直接消失,根本原因是 TP6 的 appends() 对数组键名做简单 http_build_query(),而 TP8 默认启用更严格的 URL 解析和参数归一化逻辑,对方括号语义不自动还原。
正确做法是改用 TP8 原生支持的 withQuery():
-
withQuery()必须在调用render()前设置,且不能和appends()混用 - 它会原样保留
$_GET的键结构,包括[、]、.,并自动过滤掉page等分页参数 - 无需手动
array_diff_key()或flatten_params(),避免因键名重复或编码嵌套导致二次 URL 编码 - 示例:
$list->withQuery($_GET)—— 一行解决,前提是 PHP 版本 ≥8.0 且框架为 TP8.0.12+
TP8里正则验证器_regex规则写法要重写
TP6 的 _regex 规则在 TP8 下仍能跑,但遇到中文、emoji 或复杂边界逻辑时容易静默失败——不是报错,而是 preg_match() 返回 false 导致验证通过,根源在于 TP8 默认开启严格 PCRE 模式,对未声明的命名捕获组、缺失修饰符更敏感。
必须调整三处:
- 所有正则字符串必须显式加分隔符(推荐
#或~),例如'mobile' => '#^1[3-9]d{9}$#u',不能省略u修饰符 - 反斜杠必须双写(PHP 字符串转义),
d要写成\d,否则实际传给preg_match()的是字面d,匹配失效 - 禁止在
_regex中塞进“不能纯数字”“必须含大写字母”这类复合语义;应拆成_regex做基础格式兜底 +function类型规则做语义判断,例如额外加一条['check_username' => 'function:checkUsernameFormat']
TP6控制器字符转换函数在TP8下要加strict检测
TP6 时代写的 mb_convert_encoding($str, 'UTF-8', 'auto') 在 TP8 下风险陡增:PHP 8.1+ 的 mb_detect_encoding() 对短字符串(如单个中文、4位数字)识别率下降,'auto' 极易误判为 ASCII,跳过转换,结果仍是 GBK 乱码。
必须改为显式候选集 + strict 模式:
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'GB2312'], true),第三个参数true表示 strict 检测,避免模糊匹配 - 检测结果为
false时,跳过转换(可能是二进制或空值),不要硬转 - 只对
is_string($value)类型字段处理,避免对null、int调用mb_*函数触发 warning - TP8 的请求生命周期更短,建议把转换逻辑统一收口到中间件,而不是每个控制器基类手写
TP8分页返回结构变化影响前端解析
TP6 的 paginate() 返回对象已全面 Laravel 化,TP8 沿用并强化了这一设计。前端如果还按 TP5 风格直接取 data、total 字段,会拿到空值或类型错误——因为 TP8 的 JSON 序列化输出字段是 data(内容为 Collection)、per_page、current_page、last_page,而非旧版的 list 和 count。
适配要点:
- 不要依赖
$paginator->toArray()直接返回可读数组;它内部的data是Collection,JSON 后仍嵌套一层 - 必须用
$paginator->items()提取原始数据数组,再手动组装响应体 - 关键元信息要用方法获取:
$paginator->total()(int)、$paginator->currentPage()(int)、$paginator->hasMorePages()(bool) - 若需兼容旧前端,封装一个通用返回函数,字段名强制对齐 TP5,例如
'data' => $paginator->items(), 'total' => $paginator->total(), 'current_page' => $paginator->currentPage()
TP8 的参数处理更“硬核”,不帮你猜意图,也不容忍模糊写法。方括号、正则修饰符、编码检测 strict 模式、分页字段命名——这些点看似零碎,但漏掉任一,上线后就是线上 bug,而且不容易复现。











