因为input()默认只读$_get、$_post、请求体和$_request,而thinkphp路由变量(如user/:id中的123)被单独存入request对象的param层,并不混入传统cgi变量,数据源完全隔离。

为什么 input('id') 拿不到路由里的 :id
因为 input() 默认只读 $_GET、$_POST、请求体和 $_REQUEST,而 ThinkPHP 解析出的路由变量(比如 user/:id 中的 123)是单独存进 Request 对象的 param 层,并不混入传统 CGI 变量。它俩数据源完全隔离。
常见错误现象:
- 路由定义为
Route::get('article/:id', 'index/read'),访问/article/88,但input('id')返回null - 用
$_GET['id']或$this->request->get('id')也拿不到,因为该参数根本没进$_GET
正确做法只有:走 param() —— 它是唯一能同时覆盖路由变量 + URL 查询参数 + POST 数据的入口。
$this->request->param('id') 和 $this->request->route('id') 的区别
param() 是混合层,route() 是纯路由层。两者用途完全不同,混用会出问题。
-
$this->request->param('id'):从「路由参数 + GET + POST + PUT 等所有输入」中找id,优先级是路由 > GET > POST(实际顺序受default_filter和合并策略影响) -
$this->request->route('id'):只取原始路由解析结果,比如user/<code>uid匹配到/user/99,就只返回99,哪怕 URL 上还带着?id=100也无视 - 如果你要严格区分来源(例如防止恶意 GET 参数覆盖路由 ID),必须用
route();如果只是想“拿到 id 就行”,用param()更省事
注意:route() 在非 PATHINFO 模式(如兼容模式 index.php?s=user/99)下可能为空,因为它依赖路由引擎的原始解析上下文。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
控制器方法直接写 function read($id) 能不能用
能,但有前提且容易翻车。
- 必须是标准 PATHINFO 路由(如
user/:id),且控制器方法参数名与路由变量名**完全一致**(:id→$id,不是$uid) - 如果路由是
user/<code>uid,方法就得写function read($uid),写$id就收不到 - 开启
url_param_type = 1(按顺序绑定)后,参数名不再重要,但要求 URL 路径严格按方法参数顺序拼,比如hello/thinkphp/shanghai对应hello($name, $city),一旦顺序错就全乱 - 这种写法无法设默认值(
$id = 0无效),也不方便做类型转换或过滤,调试时还难定位来源
所以除非是极简场景,否则更推荐显式调用 param() 或 route() —— 意图清晰、可控性强、IDE 友好。
多参数 + 混合传参时怎么避免冲突
当路由路径、URL 查询串、POST Body 同时带同名参数(比如都含 id),param() 默认会合并,但顺序不可控,极易覆盖。
- 典型场景:
Route::post('order/:id', 'order/update')访问/order/100?id=200,再 POST{"id": 300},此时$this->request->param('id')可能返回100、200或300,取决于内部 merge 策略 - 安全做法:明确来源,用
$this->request->route('id')拿路径 ID,$this->request->get('id')拿查询 ID,$this->request->post('id')拿提交 ID - 如果必须用
param(),建议在配置里关掉自动合并:'var_route_merge' => false(TP5.1+),这样param()就只返回路由参数,不掺其他
最易被忽略的一点:param() 返回的是混合数据,没有类型保障。比如路由 :id 是字符串 "123",但业务上你当整数用,得自己 intval() 或用 param('id/d') 做类型声明——不然数据库 where 条件可能隐式转成全表扫描。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










