codeigniter中路由与_remap()是分层协作关系:路由决定请求进入哪个控制器,_remap()负责控制器内方法调度;路由在请求最早期映射url到控制器/方法,_remap()则统一拦截并处理所有方法调用,实现url美化、权限控制和方法兜底。

CodeIgniter 的路由(routes.php)和控制器中的 _remap() 方法不是替代关系,而是分层协作:路由先决定“进哪个控制器”,_remap() 再决定“在控制器里怎么调用方法”。两者配合得当,能实现 URL 美化、权限控制、方法兜底等关键逻辑。
路由负责入口分流,_remap负责内部调度
路由规则在请求最早期生效,它把 URL 映射到具体控制器和可选方法。例如:
-
$route['user/profile'] = 'profile/show';→ 把/user/profile指向Profile控制器的show()方法; -
$route['blog/(:any)'] = 'blog/post/$1';→ 把/blog/2024-10映射为Blog::post('2024-10')。
一旦路由确定了目标控制器(比如 Blog),且该控制器中定义了 _remap(),那么无论原始 URL 是 /blog、/blog/abc 还是 /blog/xyz,CI 都不会自动尝试调用 abc() 或 xyz() —— 而是统一交由 _remap() 处理。
用_remap拦截并重定向不存在的方法
这是两者配合最典型的场景:路由把请求送进控制器后,由 _remap() 判断方法是否存在,再做兜底处理,避免触发 404。
示例(Blog.php 控制器):
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 定义
_remap($method, $params = []); - 检查
method_exists($this, $method); - 若存在且非私有(不以下划线开头),就执行
$this->$method(...$params); - 若不存在,就重定向到
index()或返回 404 视图(不跳全局 404)。
这样,访问 /blog/nonexistent 不会走到全局 $route['404_override'],而是在 Blog 控制器内静默转到首页,用户体验更平滑。
路由与_remap协同实现URL语义化
你可以让路由暴露友好的 URL,再靠 _remap() 把它映射到真实方法名,隐藏实现细节。
- 路由配置:
$route['article/latest'] = 'article';(指向Article控制器); - 在
Article.php中,_remap()检查第一个参数是否为'latest',若是则调用$this->list_latest(); - 同时支持
/article/popular→list_popular(),所有逻辑收口在_remap()里。
好处是:URL 干净、SEO 友好,控制器内部方法命名可专注功能而非 URL 可读性。
注意优先级和边界情况
两者不冲突,但需清楚各自作用域:
- 路由无法匹配时(如
/xyz/abc没任何$route规则),直接走$route['404_override'],_remap()根本不会执行; - 路由匹配成功进入某控制器,但该控制器未定义
_remap(),则 CI 按默认规则找对应方法(如/blog/abc就找Blog::abc(),找不到就 404); -
_remap()中若手动调用redirect()或show_404(),属于控制器内行为,不影响路由系统本身。










