codeigniter中路由参数与控制器方法参数通过位置严格对应:ci3用$route['p/(:num)'] = 'c/m/$1',ci4用$routes->get('p/(:num)', 'c::m'),方法须按捕获顺序声明形参,如view($id, $slug),错位或版本混用将导致传参失败。

CodeIgniter 中路由参数和控制器方法参数的对应,本质是“URL片段 → 路由规则捕获 → 方法形参接收”的传递过程。关键不在于自动注入,而在于你如何在路由定义中显式写出参数占位,并确保控制器方法的参数顺序与之严格一致。
路由里怎么写参数占位
CI3 和 CI4 写法不同,但逻辑一致:用占位符或正则捕获 URL 片段,再通过 $1、$2 等引用到右侧目标方法中。
-
CI3(routes.php):直接写字符串映射,用
$1表示第一个捕获组$route['user/(:num)'] = 'users/profile/$1';
访问/user/123→ 实际调用Users::profile(123) -
CI4(Routes.php):用
$routes->get(),占位符写在路径里,参数自动按顺序传入$routes->get('user/(:num)', 'Users::profile'); // $1 会自动作为第一个参数传入 profile() - 支持多种占位符:
(:num)(纯数字)、(:any)(非空任意字符)、(:segment)(不含斜杠的任意字符串),也可用正则如([a-z]+)
控制器方法怎么接收参数
控制器方法的参数必须与路由中捕获的个数、顺序完全匹配,且不依赖命名,只看位置。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 例如路由:
$route['post/(:num)/(:any)'] = 'blog/view/$1/$2';
对应方法签名必须是:public function view($id, $slug)(两个参数,顺序不能颠倒) - 如果只写一个参数但路由捕获两个,第二个值会被丢弃;反之,多写的参数会是
null - CI4 中还可使用类型提示(如
int $id),但框架仍按位置传值,类型仅用于 PHP 运行时校验
常见错配场景和检查点
参数对不上,90% 是因为没看清“谁在前、谁在后”或混淆了版本语法。
- 写了
$route['product/(:any)/(:num)'] = 'shop/detail/$2/$1',却在方法里写detail($id, $name)→ 实际传入的是$name给$id,值错位 - CI4 误用 CI3 写法:
$route['api/user/(:num)'] = 'Api/Users::show/$1'→ 完全无效,CI4 忽略整个$route数组 - 正则捕获组用了括号但没转义斜杠,比如
'file/(.*)\.pdf'→ 需写成'file/([a-zA-Z0-9\-_\.]+)',否则可能匹配失败或截断 - URL 中有中文或空格,而占位符只支持
(:any)(CI3)或(:segment)(CI4),需改用正则并注意编码
调试建议
别靠猜,用最直接的方式确认参数是否到位:
- CI3:在控制器方法开头加
var_dump($this->uri->segments);查看原始分段 - CI4:运行
php spark routes命令,查看实际注册的路由表和参数绑定说明 - 临时在方法里
log_message('debug', 'ID received: ' . $id);,配合日志文件验证 - 浏览器用隐身窗口测试,避免 302 缓存干扰判断










