ThinkPHP控制器推荐用Request对象的param()方法统一获取多源参数,自动合并POST>GET>路由变量,支持默认值、类型转换和嵌套提取;需隔离来源时用get()或post();JSON请求需确保Content-Type正确或通过中间件预解析。

ThinkPHP控制器方法接收请求参数,核心是用好 Request 对象 和它的方法,而不是直接读取 $_GET 或 $_POST。框架提供了统一、安全、灵活的方式,覆盖 GET、POST、路由变量、JSON Body 等常见来源。
推荐用 param() 一次性获取多源参数
$request->param() 是最常用也最推荐的方式,它自动合并以下来源(按优先级:POST > GET > 路由变量),适合绝大多数接口和表单场景:
-
$request->param('id'):取 id 参数,不存在时返回null -
$request->param('name', 'guest'):指定默认值,避免空值引发错误 -
$request->param('age/d', 0):加/d后缀自动转为整型,非法输入(如age=abc)直接得0 -
$request->param('user.'):末尾带点号,可批量提取嵌套字段(如user[name]、user[email])
需要隔离来源时,用 get() 或 post()
当业务要求严格区分参数来源(比如 URL 分页参数不能被 POST 覆盖),就该显式调用:
-
$request->get('page'):只从 URL 查询字符串取,POST 提交同名字段也不影响 -
$request->post('content/s'):只从 POST 数据取,且加/s后缀做htmlspecialchars过滤 - 注意:
get()和post()对 PUT/DELETE 等请求也有效,但只读对应原始来源,不处理 JSON 或 multipart 中的非文件字段
接收 JSON 请求体要特别处理
前端用 fetch 或 axios.post(url, { data }) 发送 JSON 时,Content-Type: application/json,PHP 的 $_POST 不会自动填充——必须手动解析原始 body:
立即学习“PHP免费学习笔记(深入)”;
- 简单方式:在控制器中写
$raw = $request->getContent(); $data = json_decode($raw, true);,再检查是否为空或解析失败 - 推荐方式:用
$request->param('key'),但需满足两个前提——请求头确实是application/json,且 body 没被其他中间件提前读取过 - 全站适配:写一个中间件,在请求进入时判断 JSON 类型,解析后用
$request->merge($data)合并进参数池,后续所有param()都能直接取值
获取方式的选择与注意事项
有三种等效写法,项目里保持统一即可:
- 助手函数:
input('id')≡$request->param('id') - 对象方法:
$request->param('id')(适合依赖注入或复用 Request 实例) - 静态调用:
Request::instance()->param('id')(不推荐,耦合度高) - 别误以为
input('id')只读 GET——它默认行为就是param(),优先取 POST



















