因为ci4默认禁用自动路由,必须在routes.php中显式定义$routes->get('/home', 'home::index'),否则直接404;该路由需放在set404override()前,且url路径与控制器类名大小写须严格匹配。

为什么 /home 访问直接 404?
不是控制器没写对,而是 CI4 根本不认“文件名即路由”这套——它默认关闭自动路由,$routes->setAutoRoute(false) 是硬性设定。你访问 /home 时,框架只查 app/Config/Routes.php 里有没有明确定义这条规则,没有就立刻抛出:Can't find a route for 'get: home'。
常见错误现象:
- 明明
app/Controllers/Home.php存在且class Home extends BaseController写得标准,但浏览器仍 404 -
http://localhost/也打不开,其实是误删了默认首页路由
必须手动注册:
$routes->get('/home', 'Home::index');
注意三点:
-
/home是 URL 路径,不是文件路径或类名前缀 -
Home::index中的Home必须首字母大写,且与文件名Home.php完全一致 - 该行要放在
$routes->set404Override()之前,否则会被兜底逻辑覆盖
$routes->get() 和 $routes->add() 用哪个?
$routes->get() 是推荐写法,它明确限定 HTTP 方法,避免意外响应 POST 或 PUT 请求;$routes->add() 是通配方法,不校验请求方式,容易引发安全或逻辑错乱。
使用场景差异:
- 表单提交页(如
/login)通常需同时支持 GET 展示页面、POST 处理提交 → 单独写两行:$routes->get('/login', 'Auth::showLogin')+$routes->post('/login', 'Auth::attemptLogin') - 纯 API 端点(如
/api/users)建议按方法拆分,避免用$routes->add()模糊处理 - 资源型路由(如博客文章 CRUD)可直接用
$routes->resource('posts'),它自动生成 7 条标准 REST 路由
性能影响:用 get/post/put/delete 显式声明,CI4 路由匹配器能跳过方法不匹配的规则,比 add() 稍快一点,尤其路由多时。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
动态参数怎么传进控制器?
别在构造函数里塞参数——public function __construct($id) 会直接触发 Too many arguments to method 致命错误。CI4 控制器构造函数只接受依赖注入,运行时参数必须通过方法签名接收。
正确写法:
$routes->get('/product/(:num)', 'Product::view/$1');
对应控制器方法:
public function view(int $id)
{
// $id 自动被注入,无需手动解析
}
关键细节:
-
(:num)只匹配纯数字,(:any)匹配不含/的任意字符串,(:segment)才允许含斜杠(如/blog/category/sub) - 通配符路由必须放在静态路由之后、
$routes->set404Override()之前,否则会吞掉/admin这类路径 - 若需校验 slug 是否存在,应在控制器里查数据库,匹配失败再 throw
new \CodeIgniter\Exceptions\PageNotFoundException()
为什么 .htaccess 生效但还要加 index.php?
这不是路由写错了,是 Apache 重写规则没真正生效。CI4 依赖 public/.htaccess 把请求转发给 index.php,如果仍需手动加 index.php 才能访问,说明重写被忽略。
排查步骤:
- 确认
httpd.conf中对应目录段落有AllowOverride All(不是None) - 检查
public/.htaccess文件是否真实存在且内容未被清空(XAMPP 默认自带) - 运行
php spark routes,看输出里是否有你定义的路由——如果没有,说明Routes.php语法错误或缓存未清 - 执行
php spark cache:clear清除路由缓存,CI4 默认缓存配置,改完路由不清理就白改
容易被忽略的是:CI4 的路由缓存和 OpCache 有时会叠加干扰,开发阶段建议在 .env 中设 CI_ENVIRONMENT = development,并确保 app/Config/Cache.php 中 $cacheHandlers 不启用文件缓存路由。










