ThinkPHP 6.1+ 中 $request->param() 默认仅读取 POST 类数据,不再合并 GET 参数;6.2+ 废弃 only() 的字符串字段语法,强制使用数组;验证器 data 来源需显式统一,JSON 请求体会被扁平化处理。
ThinkPHP 6.1+ 中
不再默认合并 GET 和 POST
升级到 ThinkPHP 6.1 或更高版本后,
默认只读取
(含
/
)数据,不再自动合并
查询参数。这是最常导致“参数丢失”的原因。
如果你的接口习惯用
传参,又在控制器里直接写
,升级后很可能拿不到值。
修复方式:显式指定来源,比如
或更稳妥地用
/
分开取
若仍需合并行为,可手动组合:
,但注意键冲突时
覆盖
的第四个参数控制来源,默认是
(仅 POST 类),不是
—— 这个默认值在 6.0 和 6.1+ 之间变了
ThinkPHP 6.2+ 移除了
的字符串字段列表支持
以前可以写
,6.2 开始这个写法会报错:
。
它现在强制要求传数组,且不接受逗号分隔的字符串,连空格都不行。
立即学习
“
PHP免费学习笔记(深入)
”;
必须改成
如果字段名来自用户输入或配置,记得先
再过滤空项,否则可能带入空字符串导致意外截断
默认不递归处理嵌套字段(如
),要支持点语法得额外加第三个参数
,但要注意安全:未声明的嵌套路径会被忽略
验证器中
来源不一致导致规则失效
用
手动验证时,和直接在控制器里用
行为不同 —— 后者内部调用了
,受前述“仅 POST”逻辑影响;前者完全依赖你传入的
数组。
常见坑是:你在控制器里写了
,以为能拿到全部参数,结果因
没含
,验证就漏了查询条件。
推荐统一入口:先明确拼好数据,比如
,再传给验证器
验证器的
不影响数据来源,只过滤字段,所以别指望
能帮你“补回”没取到的参数
如果用了
独立包(非框架内置),版本差异更大,
参数必须是完整数组,且不自动解析
请求体 —— 需提前用
JSON 请求体里的嵌套数组被自动转成点式键名
前端发
,body 是
,ThinkPHP 默认会把
当作键存进
,而不是保持嵌套结构。
这不是 bug,是设计:框架把 JSON 解析后的数组扁平化了,方便用
直接取值。但如果你的验证规则或业务逻辑依赖原生嵌套结构,就会出问题。
要保留原始结构,改用
或
—— 它们不会扁平化,但前提是请求方法匹配(
方法 + JSON body 才进
)
或者手动还原:
,绕过框架解析
注意:开启
时,
在日志里显示的是扁平化后的结果,容易误判数据形态
实际项目里最麻烦的不是某一个变更,而是多个机制叠加:比如你同时用了 JSON 请求、
字符串字段、又依赖
自动合并 —— 升级后三处全崩,但错误表现分散,很难一眼定位根源。
$request->param()$request->param()POSTPUTPATCHGET?id=123&status=1$request->param('id')$request->param('id', '', 's', 'get')$request->get('id')$request->post('id')array_merge($request->get(), $request->post())postget$request->param()'param''all'$request->only()$request->only('name,email,age')TypeError: only() expects parameter 1 to be array$request->only(['name', 'email', 'age'])explode(',', $str)$request->only()user.nametruedataValidate::make()->check($data)$this->validate($request->param(), ...)$request->param()$data$this->validate($request->param(), ...)param()GET$input = array_merge($request->get(), $request->post())scenescenethink-validatedataJSON$request->isJson() && json_decode($request->getContent(), true)Content-Type: application/json{"user": {"name": "张三", "tags": ["a","b"]}}user.name$request->param()$request->param('user.name')$request->post()$request->get()POSTpost()json_decode($request->getContent(), true) ?: []app_debug = true$request->param()only()param()