命名路由解耦url与逻辑,避免硬编码导致的全局替换;ci4中route()和redirect()必须配合命名路由传参;需显式声明as键且参数顺序严格匹配;是过滤器绑定唯一可靠依据;多语言场景下提供稳定锚点。

命名路由让 URL 变更不牵一发而动全身
当你硬编码 /users/edit/123 在控制器、视图或重定向里,一旦某天要改成 /admin/users/update/123
editUser 是个标识符,背后对应哪条路径,只在 routes.php 里定义一次。
CI4 的 route() 函数必须配合命名路由才能传参
CI4 的 redirect() 或 url_to() 如果想动态拼接带 ID 的 URL,不能靠字符串拼接(易出错、难维护),必须用命名路由 + route():
route('editUser', ['id' => 123])
这行代码会自动查表,把 editUser 映射成真实路径(比如 admin/users/edit/$1),再把 123 填进占位符。没命名,route() 就不认识你传的参数名。
- 命名路由必须显式声明
as键:$routes->get('users/edit/(:num)', 'Users::edit/$1', ['as' => 'editUser']) - 参数顺序必须和路由定义中
(:num)、(:any)出现顺序一致 - 如果路由用了多个通配符,比如
posts/(:num)/comments/(:any),route('postComment', [101, 'abc'])才能正确展开
命名路由是过滤器(Filter)绑定的唯一可靠依据
CI4 的路由级权限控制依赖命名路由。你想对所有编辑类操作统一加认证,不能写 $routes->filter('auth', ['before' => ['users/edit/(:num)', 'products/update/(:num)']])——这种写法脆弱且不可扩展。正确做法是:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 给每条编辑路由加命名:
['as' => 'userEdit', 'as' => 'productUpdate'] - 然后用
$routes->filter('auth', ['before' => ['userEdit', 'productUpdate']])
这样增删编辑路由时,只要保持命名规范,过滤器配置完全不用动。漏命名,过滤器就失效,而且不会报错,只默默放行。
命名路由在多语言场景下避免 URI 混乱
多语言项目常把语言码塞进 URL(如 /zh_cn/users),但路由匹配前必须先剥离它,否则 $routes->get('users', ...) 根本收不到请求。这时候命名路由是安全出口:
- 路由定义里不写语言前缀:
$routes->get('users', 'Users::index', ['as' => 'usersList']) - 多语言中间件剥离
zh_cn/后,仍能通过route('usersList')生成不含语言段的标准链接 - 前端模板里统一用
route('usersList'),而不是手拼/<?php echo $lang ?>/users,避免语言切换时链接失效
命名路由本身不处理多语言,但它提供了一个稳定锚点——不管 URL 结构怎么变,名字不变,调用就不崩。










