thinkphp路由变量名必须与方法参数名完全一致,严格区分大小写且不支持别名映射;未设默认值将直接报500错误;需用pattern()正则约束防注入,仅对:path形式生效。

路由变量名必须和方法参数名完全一致
ThinkPHP 默认按名字绑定,不是按顺序,也不是靠类型提示。访问 /article/123 时,只有控制器方法里声明了 $id 这个参数,且路由规则中定义了 :id 或 <id></id>,才能自动注入值。
常见错误现象:参数错误: aid —— 路由写了 article/:id,但方法是 detail($aid),框架找不到 $aid 对应的路由变量,直接抛异常。
- 大小写敏感:路由变量
:ID不会绑定到$id - 不支持别名映射:不能指望
:uid自动塞进$id,必须参数名一致 - 路径段必须存在:如果路由是
user/:id/name/:name,那$id和$name都得在方法签名里声明,缺一不可
每个参数都必须设默认值,否则请求直接 500
没默认值的参数,哪怕路由匹配成功,也会在调度阶段报错——框架不会传 null 或跳过,而是中断执行并返回白屏或 500 错误。
正确写法示例:public function show($id = 0, $status = '');错误写法:public function show($id)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 数字型建议用
0,避免后续参与运算出错(如$id + 1) - 字符串型建议用空字符串
'',比null更安全(strlen(null)触发 warning) - 布尔型慎用
false作默认值,容易和业务逻辑中的 “显式 false” 混淆
pattern() 是防注入的必选项,不是可选配置
路由变量只做名字匹配,不做任何类型校验。不加 pattern(),/user/abc 会把字符串 'abc' 直接传给 $id,后续查数据库大概率报错,甚至引发 SQL 注入。
必须显式约束,例如:Route::get('user/:id', 'User/read')->pattern(['id' => '\d+'])。
-
pattern()只对:xxx或<xxx></xxx>形式的路径变量生效,对?id=123查询参数无效 - 正则不用写
^和$,框架会自动包裹;写成'^\d+$'反而匹配失败 - 多个变量一起约束:
->pattern(['id' => '\d+', 'token' => '[a-zA-Z0-9_]{16,32}'])
模型绑定要显式调用 bind(),类型提示无效
ThinkPHP 8.0 中,即使你写 public function read(User $user),$user 依然是 null —— 框架不会自动识别类型提示。必须在路由定义里显式调用 bind()。
例如:Route::get('user/:id', 'User/read')->bind(['id' => \app\model\User::class])。
- 键名
id必须和路由变量:id完全一致,包括大小写 - 若模型主键不是
id(比如是uid),必须在模型中声明protected $pk = 'uid',或在bind()里指定字段:['uid' => [\app\model\User::class, 'uid']] - 绑定失败默认返回 404,且不经过控制器逻辑,日志里也看不到堆栈 —— 这是最容易被忽略的调试盲区
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










