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

ThinkPHP中Request对象获取参数的变化及兼容写法

ThinkPHP 6.0+ 废弃 Request::instance(),应改用门面类 \think\facade\Request 或助手函数 request();param() 合并 GET/POST/Route 并过滤空值,但不解析 JSON 请求体,JSON 数据需用 input() 或 json(true) 显式获取。 Request::instance()->param() 在 ThinkPHP 6.0+ 已失效 ThinkPHP 6.0 起彻底移除了静态单例模式的
Request::instance()
,调用它会直接抛出
Fatal error: Uncaught Error: Call to undefined method think\Request::instance()
。这不是配置问题,是框架底层重构导致的硬性废弃。 真正可用的入口是容器注入或助手函数: 控制器方法参数自动注入:
public function index(\think\Request $request)
助手函数
request()
(返回当前请求实例) 门面类
\think\facade\Request
(推荐,与 TP5 兼容性较好) param()、get()、post() 等方法的行为差异
param()
默认合并
GET
+
POST
+
Route
参数,且会自动过滤空值(如
null
、
''
、
[]
),但不处理 JSON 请求体;
get()
和
post()
则严格按来源取值,不会合并也不会过滤。 常见踩坑点: 立即学习 “ PHP免费学习笔记(深入) ”; 用
param('id')
获取不到 POST JSON 数据里的
id
—— 需改用
input('id')
或
json()
表单提交空字符串时,
param('name')
返回
null
,而
post('name')
仍返回
''
param()
不识别
application/json
请求体,必须显式调用
json(true)
才能解析 TP5 升级到 TP6 的兼容写法 如果老项目大量用了
Request::instance()->param()
,又不想逐个改控制器,可以用门面兜底:
// 替换所有 Request::instance()->xxx 为 \think\facade\Request::param() \think\facade\Request::get() \think\facade\Request::post()
注意两点: 门面类在 TP6 中默认启用,无需额外配置 TP5 的
input('name')
在 TP6 里行为有变:TP6 的
input()
默认只读
GET
/
POST
,不读路由变量,要读路由需显式写
input('name', '', 's')
或改用
param()
JSON 请求体必须显式解析 TP6 不再自动将
application/json
请求体合并进
param()
或
post()
,这是和 TP5 最关键的区别。如果你的接口接收前端
fetch({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({a:1}) })
,直接
param('a')
会返回
null
。 正确做法只有两个: 用
input('a')
—— 它内部会尝试解析 JSON(但仅限顶层字段) 用
json(true)
获取完整 JSON 数组,再手动取值:
$data = \think\facade\Request::json(true); echo $data['a'] ?? null;
别依赖
post()
或
param()
自动处理 JSON,它们真的不会碰请求体。

相关文章