跳转到主内容
极星编程网:以代码为星,赴技术山海!

ThinkPHP请求对象属性获取变更_升级后的输入参数处理技巧

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

相关文章