request::param() 合并get/post/路由参数且后覆盖前,input()可指定来源、类型和过滤;param()无处理、不支持嵌套和json,input()更安全可控。

Request::param() 会合并 GET/POST/路由参数,input() 可指定来源和类型
Request::param() 是“全量兜底”式读取:它把 $_GET、$_POST 和路由变量(如 /user/:id 中的 id)三者合并,按“后覆盖前”顺序(POST > GET > 路由)返回一个数组。而 input() 默认也走这个路径,但支持显式限定来源,比如 input('name', '', 'htmlspecialchars') 实际只查 POST 或 GET,不碰路由;input('post.name/s') 则强制只从 POST 取、且加字符串过滤。
常见误用是写 param('id') 以为只取路由 ID,结果前端带了 ?id=999,POST 又没传,反而拿到 GET 的值——这在 RESTful 接口里容易引发逻辑错乱。
-
param('status')可能来自 URL 查询串、表单字段或路由占位符,来源不可控 -
input('status')行为同param(),但加了/d后缀(如input('status/d'))会强制类型转换,失败即返回默认值,比param()更安全 - 想只取 POST 字段?必须写
input('post.name')或input('name', '', '', 'post'),否则可能被 GET 同名参数干扰
input() 支持类型转换和过滤,param() 默认不做任何处理
param() 返回的是原始 PHP 值,空格不 trim、HTML 不转义、数字字符串不转整型。比如前端传 name=%20admin%20,param('name') 得到的是 " admin "(含首尾空格),而 input('name/s') 会自动调用 htmlspecialchars(trim($value))。
更关键的是嵌套字段支持:input('user.name') 能正确解析 JSON 或表单里的 user[name],但 param('user.name') 在 TP6 中无法识别点号语法,直接返回 null。
-
input('price/d', 0)确保得到整数,非法输入(如"abc")返回 0;param('price')返回字符串"abc",后续 intval() 可能静默变成 0,难以排查 -
input('tags/a')显式声明要数组,即使前端传tags=1也会返回[1];param('tags')在这种情况下返回字符串"1",容易导致 foreach 报错 - filter 参数对嵌套字段无效:
input('user.email/s')中的/s只作用于顶层user.email字符串,不会递归处理user数组内部字段
JSON 请求体下 param() 完全失效,input() 必须配合 getRawContent() 才能准确读取
当 Content-Type 是 application/json 时,param() 根本拿不到数据——它不解析 php://input,也不触发 JSON 自动解码。而 input('data') 表面能取到值,是因为框架在第一次调用时悄悄执行了 json_decode($this->getRawContent(), true) 并缓存结果;但如果你先调了 param() 或其他读取原始体的操作,input() 就可能返回空。
真正可靠的做法是:控制器开头就用 $this->request->getRawContent() 拿原始字节流,自己 json_decode(),再做校验。依赖 input() 处理 JSON 是在赌框架缓存行为,线上环境容易翻车。
- 不要在中间件或前置逻辑里调用
param()或input(),否则 JSON 请求体可能被提前读空,后续控制器拿不到数据 -
input('data.json')这种写法不存在,TP6 不支持通过点号访问 JSON 内部字段;必须先解出整个对象,再用 PHP 数组语法取值 - 日志审计需要原始请求体?必须在任何
input()调用前捕获getRawContent(),否则原始二进制数据就丢了
命令行模式下两者都不可用,必须手动解析 $argv
在 think command:run 这类 CLI 场景中,param() 和 input() 全部返回空——因为它们底层依赖 HTTP 生命周期和超全局变量,而 CLI 下 $_GET、$_POST、$_SERVER['REQUEST_METHOD'] 全是空或不存在。
实际做法是直接处理 $argv:用 array_slice($argv, 2) 剔除命令名和脚本路径,再用 array_map('trim', ...) 清洗,最后用 parse_str(implode('&', $args), $parsed) 转成键值对(模拟 --name=jack --age=25)。
- 别试图在命令行里调用
$this->request->param(),它永远返回空数组 - 框架的
default_filter配置在 CLI 下完全不生效,所有过滤必须手写 - 如果参数含等号(如
--config=prod.json),parse_str()会正常识别;但--config prod.json这种空格分隔格式需额外正则匹配
param() 和 input() 的真实分水岭。用错一个,轻则参数污染,重则审计断档。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











