input()默认不读取路由参数,因其底层仅访问$_GET/$_POST等超全局变量,而路由参数(如/user/:id中的123)由Pathinfo解析后存于Request对象param缓存中;正确方式是在控制器动作方法中调用param(),且路由必须显式声明占位符(如'user/:id'),CLI模式下则需手动解析$_SERVER['argv']。

input() 默认不读取路由参数,这是设计使然
ThinkPHP 的 input() 函数底层只读取超全局变量($_GET、$_POST、$_REQUEST 等),而路由参数(如 /user/:id 中的 123)是通过 Pathinfo 解析后存入框架内部 Request 对象的 param 缓存,并不写入 $_GET。所以 input('id') 或 input('get.id') 必定返回空或默认值——它根本没去那里找。
param() 才是正确入口,但调用时机很关键
param() 是 ThinkPHP 封装的统一参数获取方法,它会自动合并路由参数、GET、POST、PUT 等来源。但要注意:
- 必须在控制器的动作方法(如
index()、read())中调用,不能在构造函数里——此时路由尚未解析,param('id')一定为空 - 闭包路由中可用,但需确保闭包执行在匹配之后(默认满足)
- 若用了中间件且提前调用了
input(),可能干扰后续param()行为;建议中间件里也统一用param()
路由定义漏了冒号,param() 也救不了
常见错误是写成 Route::get('user', 'index/User/read'),哪怕 URL 是 /user/123,param('id') 仍返回 null。因为框架不会自动从路径截取并映射变量名,必须显式声明占位符:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正确:
Route::get('user/:id', 'index/User/read') - 可选参数:
Route::get('user/:id?', 'index/User/read')(注意:不带?是必填,匹配失败直接 404) - 多个参数顺序必须严格一致:
user/:id/:type≠user/:type/:id,否则param('type')拿到的是 id 的值 - 中文或数字约束要用
->pattern(),例如->pattern(['id' => '\d+']),否则可能匹配到非法值
命令行请求下 input() 和 param() 都失效
CLI 模式(如 php think hello --name=jack)不走 HTTP 生命周期,input() 和 $this->request->param() 全部无效。此时必须手动处理 $_SERVER['argv']:
立即学习“PHP免费学习笔记(深入)”;
-
input()底层依赖 Request 实例,而 CLI 下 Request 不解析$argv - 推荐在命令类
handle()方法开头用array_slice($_SERVER['argv'], 2)提取参数段,再用parse_str()或正则清洗 - 别指望
input('name')能拿到--name=jack,它只会返回空字符串或默认值
:id 明确告诉它。


















