ThinkPHP6.x中GET用get()、POST用post()、JSON需显式解析(如json()或withJson(true)),param()仅适合合并场景且不处理JSON,选错方法将导致取值失败或安全隐患。

ThinkPHP6.x 的 Request 对象是处理客户端输入的核心组件,但不同数据来源(URL 查询、表单提交、JSON 请求体)必须用对方法,否则容易拿不到值或引入安全隐患。
GET 参数:用 get() 最准确
当明确只取 URL 查询字符串(?a=1&b=2)里的参数时,request()->get() 是首选。它只读 $_GET,不混入 POST 或路由变量,避免意外覆盖。
- 获取全部:
request()->get() - 取单个字段并过滤:
request()->get('name', '', 'htmlspecialchars') - 取多个指定字段:
request()->only(['id', 'page'], 'get')
注意:如果路由定义为 'user/:id',get('id') 拿到的是路由匹配的值(如 /user/123 中的 123),不是查询参数中的 id —— 这是设计行为,不是 bug。
POST 表单:用 post() 更可控
针对传统 application/x-www-form-urlencoded 或 multipart/form-data 提交的表单数据,request()->post() 直接读取 $_POST,不合并、不自动类型转换,适合需要原始值的场景。
立即学习“PHP免费学习笔记(深入)”;
- 获取全部:
request()->post() - 带默认值和过滤:
request()->post('email', '', 'trim|email') - 只取白名单字段:
request()->only(['username', 'avatar'], 'post')
不要依赖 param() 处理纯表单提交,尤其当字段可能为空字符串时:param('field') 对未提交字段返回 null,而 post('field') 返回空字符串,语义更清晰。
JSON 请求:必须显式解析,不能靠 param() 或 post()
前端发 Content-Type: application/json 时,TP6 默认不解析请求体。param()、post()、input() 都拿不到数据,因为它们不处理 JSON 原始流。
- 推荐方式(TP6.1+):
request()->withJson(true)开启自动解析,之后可用request()->json('user.name')或request()->json()获取完整数组 - TP6.0 兼容写法:
request()->json(true)(注意不是input()) - 手动读取原始体:
file_get_contents('php://input')+json_decode(),但需自行校验格式与安全性
关键细节:Content-Type 必须严格为 application/json,带 ; charset=utf-8 可能在某些版本失效;json() 对非法 JSON 返回 null,不抛异常,记得判空。
统一入口?慎用 param()
param() 会合并 GET、POST 和路由变量,按“后覆盖前”顺序(如 POST 字段同名会覆盖 GET),适合快速构建简单表单接口。但它完全忽略 JSON 请求体,且对空字符串、数字字符串等有隐式类型转换,不适合需要精确控制的场景。
- 适合:
param('id')在普通页面跳转或搜索表单中取参数 - 不适合:JSON API、需要区分空值与未传值、字段名含点号或特殊字符
- 替代方案:明确来源 + 显式过滤,比如
request()->get('sort', 'id') ?: request()->post('sort', 'id')
不复杂但容易忽略。选对方法比写多行判断更重要。



















