TP6中Request::instance()已彻底移除,必须改用依赖注入$requests、助手函数request()或门面类\think\facade\Request;param()不解析JSON,JSON数据需用input()或json(true)获取。

直接说结论:在 ThinkPHP 6.0 控制器里,别再用 Request::instance(),它已彻底移除;优先用依赖注入 \think\Request $request 或助手函数 request(),参数获取必须分清来源——param() 不处理 JSON,get()/post() 不合并,input() 才是 JSON 场景的可靠选择。
为什么 Request::instance() 在控制器里会报错
这不是配置没开、也不是命名空间写错,而是 TP6 底层删掉了静态单例入口。任何形如 Request::instance()->param('id') 的写法,运行时直接抛出 Fatal error: Call to undefined method think\Request::instance()。老项目升级后大面积报错,基本都卡在这儿。
替代方案只有三个且互不冲突:
- 控制器方法参数自动注入:
public function index(\think\Request $request)(推荐,类型安全、IDE 友好) - 使用助手函数:
$request = request();(返回app\Request实例,TP5 升级兼容性最好) - 门面类调用:
\think\facade\Request::param('id')(适合全局工具函数或静态上下文)
param()、get()、post() 的行为差异和陷阱
param() 默认合并 GET、POST、路由变量(route),按“后覆盖前”优先级,但完全忽略 application/json 请求体;get() 和 post() 则严格只读对应超全局数组,不合并、不过滤、不解析 JSON。
立即学习“PHP免费学习笔记(深入)”;
常见错误现象:
-
param('id')在 POST JSON 请求中返回null—— 因为 JSON body 没被读取 - 表单提交空字符串
<input name="name" value="">,param('name')返回'',而post('name')也返回'',但param('name')对未提交字段返回null - URL 是
/user/123?name=test,路由规则为'user/:id',此时get('id')拿到的是路由值123,不是查询参数(这是设计行为,非 bug)
JSON 请求体必须显式处理,input() 是最简路径
前端发 fetch({ method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ id: 1 }) }),param('id') 和 post('id') 都拿不到数据。唯一稳妥做法是:
- 用
input('id')—— 它内部会尝试解析 JSON body(仅限顶层字段,不递归) - 或用
json(true)获取完整结构:$data = request()->json(true); $id = $data['id'] ?? null; -
input('id/d')还能自动转整型,input('name/s')强制转字符串,比手动intval()更安全
注意:input('id', '', 'htmlspecialchars') 的过滤只作用于最终值,不改变原始 JSON 解析逻辑。
RESTful 场景下 PUT/PATCH 参数怎么取
浏览器原生表单不支持 PUT/PATCH,所以实际请求多靠伪造(如 _method=PUT)或 JSON 提交。TP6 的 param() 默认支持 PUT/PATCH 方法的参数合并,但前提是请求头 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data。
如果用 JSON 提交 PUT 请求,依然要走 input() 或 json(true),param() 不会主动解析 body。
另外,request()->put('id') 和 request()->patch('id') 方法存在,但只对传统表单编码有效;对 JSON,它们和 post() 一样返回空。



















