必须显式声明带命名空间的路由,CI4不会自动识别子目录结构;控制器命名空间须为App\Controllers\Admin且类名与文件名一致;路由注册需用Admin\Dashboard::index格式,不可用斜杠或省略命名空间;推荐使用路由分组统一前缀。

要在CodeIgniter 4中让子目录下的控制器(如app/Controllers/Admin/Dashboard.php)通过/admin/dashboard正常访问,必须显式声明带命名空间的路由——CI4不会自动识别子目录结构,仅靠文件路径无法映射URL。
确认控制器命名空间与类名
打开app/Controllers/Admin/Dashboard.php,检查顶部命名空间是否为App\Controllers\Admin,且类名为Dashboard(首字母大写,与文件名完全一致)。
若命名空间写成App\Controllers或App\Controllers\Admin\Dashboard,CI4将找不到该类,直接抛出Class 'App\Controllers\Admin\Dashboard' not found错误。
【命名空间必须是 App\Controllers\Admin】
在Routes.php中注册子目录路由
编辑app/Config/Routes.php,在$routes->set404Override()之前添加:
$routes->get('/admin/dashboard', 'Admin\Dashboard::index');
注意:这里用反斜杠\分隔命名空间层级,不是正斜杠/;Admin\Dashboard对应App\Controllers\Admin\Dashboard类,CI4会自动补全App\Controllers\前缀。
这一步不能写成'Admin/Dashboard::index'或'Dashboard::index',否则路由解析失败,仍返回404。
批量注册子目录下所有控制器路由
方法一:使用路由分组统一前缀
在Routes.php中添加:
$routes->group('admin', ['namespace' => 'App\Controllers\Admin'], function ($routes) {<br> $routes->get('/', 'Dashboard::index');<br> $routes->get('users', 'Users::index');<br> $routes->get('settings', 'Settings::edit');<br>});
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
这样访问/admin、/admin/users、/admin/settings即可分别触发对应控制器方法。分组自动注入命名空间,避免重复写Admin\。
方法二:启用自动路由(仅限开发环境)
取消注释或设置:$routes->setAutoRoute(true);
⚠️ 提示:自动路由对子目录支持有限——它只识别App\Controllers直系子目录,Admin这类二级目录需额外配置命名空间别名,生产环境强烈不建议启用。
验证路由是否生效
第一步:清除路由缓存
执行命令:php spark cache:clear
第二步:列出当前全部注册路由
执行命令:php spark routes
第三步:在输出列表中查找GET /admin/dashboard是否对应Admin\Dashboard::index
如果没出现,说明路由未被加载——常见原因是Routes.php语法错误(如漏掉分号)、文件编码含BOM头,或修改了错误的Routes.php(比如改了app/Config/Production/Routes.php但当前环境是development)。


















