param()合并get/post/路由变量并自动过滤,适合常规业务;input()读原始值无处理,json接口或需保留格式时必用。

直接用 request() 助手函数最省事,但真要写稳定代码,得看清楚数据从哪来、要不要过滤、有没有被路由吞掉——否则 param('id') 返回 null 时你根本不知道是参数丢了,还是框架没认出请求类型。
param() 和 input() 到底该选哪个
param() 是合并 GET + POST + 路由变量后的“业务参数”,自动 trim、转数字、空值变 null;input() 默认只读原始字符串,不做任何处理,适合需要保留空格或原始格式的场景。
- 表单提交、URL 查询这类常规交互,用
param('name')没问题,它已经帮你做了基础清洗 - JSON 接口必须用
input('')(空字符串)读原始 body,再json_decode(),param()完全拿不到数据 - 想批量取
data.title、data.content这类嵌套字段,只能用input('data.', '', 'array'),param()不支持前缀匹配 - 第三个参数传
null表示不过滤,input('name', null, null)可以拿到原始值;param()没这个选项,它永远走内置过滤链
为什么 get() / post() 有时取不到数据
不是方法写错了,而是请求没被识别成对应类型。常见原因有三个:
-
Content-Type错了:前端发 JSON 却设成application/x-www-form-urlencoded,TP5 就不会解析 body,post()必然为空 - 开启强制路由后,
index.php?s=/user/info&id=123这种 URL 的查询参数可能被路由规则吃掉,get('id')拿不到,但param('id')还能取到(因为合并了) - PHP 配置里
max_input_vars太小,超长表单字段会被截断,post()看起来就是空数组
Request 对象在控制器里怎么安全注入
别总用 request() 助手函数,容易掩盖依赖关系。推荐三种方式,按优先级排序:
- 依赖注入:在控制器方法签名里写
public function index(Request $request),TP5 自动注入,类型明确、IDE 可提示 - 构造函数注入:在控制器
__construct()里接收Request $request并赋给$this->request,后续所有方法都能用 - 静态调用:仅限临时调试,
Request::instance()->param('id'),但无法被单元测试 mock,不推荐长期使用
注意:CLI 环境下 Request 默认没有 GET/POST 数据,得手动 bind() 或换用 think\console\Request。
动态绑定属性的实际用途
可以在基类控制器里把登录用户、权限信息提前绑到 Request 实例上,避免每个方法都查一次数据库:
public function _initialize()
{
$user = User::get(session('user_id'));
$this->request->bind('user', $user);
}
之后 anywhere 都能用 $this->request->user 直接取,不用重复判断或缓存。但要注意:绑定的是对象引用,如果后续修改了 $user 属性,$this->request->user 也会同步变化。
真正难的不是记住方法名,而是每次取参数前,先问一句:这数据是谁发的?HTTP 头对不对?路由有没有干扰?过滤要不要关?漏掉任意一环,param() 返回 null 就只是个开始。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











