必须用 $routes->group() 统一管理前缀、命名空间和中间件,否则易导致类找不到、权限漏控、嵌套混乱;其三个参数需显式配置 namespace 和 filter,动态参数仅支持在闭包内路由中使用。

直接用 $routes->group(),别手写前缀,否则很快失控。
为什么必须用 $routes->group() 而不是每个路由加 admin/
手动拼 admin/dashboard、admin/users 看似省事,但三件事立刻出问题:控制器类找不到(缺 namespace)、没权限拦截(漏 filter)、子路径嵌套时前缀重复或错位。CI4 的 $routes->group() 是唯一能把前缀、命名空间、中间件三者绑定在同一个作用域里的机制,不是“可选语法”,是结构必需。
-
$routes->get('admin/dashboard', 'Admin::dashboard')会走默认命名空间,大概率报Class 'App\Controllers\Admin::dashboard' not found - 每个路由单独加
->setFilter('auth')容易遗漏,而$routes->group('admin', ['filter' => 'auth'], ...)保证所有子路由自动受控 - 如果后台还要分
admin/api和admin/pages,嵌套$routes->group('api', [...], function() {...})比维护两套前缀字符串清晰得多
$routes->group() 的三个参数怎么填才不踩坑
它接收三个参数:$name(字符串前缀)、$options(配置数组)、$callback(闭包)。最容易跳过的其实是 $options 里的 namespace 和 filter。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
-
$name就是 URL 前缀,比如'admin',最终访问地址是/admin/dashboard -
$options必须显式写['namespace' => 'App\Controllers\Admin', 'filter' => 'auth'],否则闭包里写的Dashboard::index仍按App\Controllers找类,不是App\Controllers\Admin -
$callback内部的路由写法和顶层一样,但路径不再带前缀,比如写$routes->get('dashboard', 'Dashboard::index'),不是$routes->get('admin/dashboard', ...)
嵌套分组和动态参数的实际写法
嵌套没问题,但中间件执行顺序是外层先于内层;动态占位符(如 (:num))只能写在闭包内的具体路由里,不能塞进 $name 参数中。
- 正确嵌套:
$routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'auth'], function ($routes) { $routes->group('api', ['filter' => 'cors'], function ($routes) { $routes->get('users/(:num)', 'Users::view/$1'); }); });最终路径是/admin/api/users/123,auth先执行,cors后执行 - 错误写法:
$routes->group('admin/(:num)', [...], ...)——$name不支持占位符,会直接报错或匹配失败 - 参数传递要靠
$1注入:$routes->get('posts/(:num)/edit', 'Posts::edit/$1'),控制器方法签名得是public function edit($id)
CORS 和 API 前缀容易被忽略的联动点
base_url() 不影响路由匹配,但 API 接口的跨域策略必须和路由分组的 filter 绑定。比如 /api/v1/users 这种路径,不能只靠 Nginx 配置 CORS,得在 $routes->group('api', ['filter' => 'cors']) 里明确挂载过滤器,否则前端发请求时预检(OPTIONS)可能直接 404 或被拒绝。
真正麻烦的是前后端分离项目里,/api 分组和 /admin 分组共存时,cors 过滤器的 before / after 逻辑得区分是否含 Authorization 头——这个细节不查文档很容易漏掉,结果就是登录态传不过去。










