CI4默认关闭自动路由,/home必须显式定义$routes->get('/home', 'Home::index'),否则报404;需确保路径以/开头、类名首字母大写、方法名小写,并在set404Override()前注册且执行php spark cache:clear生效。

CI4 默认不自动把 /home 映射到 Home::index,哪怕文件存在、类名正确、方法可用——没在 Routes.php 里写明,就一定是 404。
为什么 /home 访问直接报 404
CI4.6.8 关闭了自动路由($routes->setAutoRoute(false)),所有路径必须显式注册。错误信息 Can't find a route for 'get: home' 就是这个意思:框架根本没看到你为 /home 定义过规则。
- 不是控制器文件名或类名写错(
app/Controllers/Home.php和class Home extends BaseController没问题) - 不是大小写混淆(
Home::index中的H和i必须大写首字母 + 小写方法名) - 不是 Apache 或 Nginx 配置遗漏(只要
public/是 Web 根目录且.htaccess生效,基础重写就 OK) - 真正卡点:你漏写了
$routes->get('/home', 'Home::index');
$routes->get() 的参数细节和常见误写
CI4 路由语法严格,稍有偏差就失效。重点看三处:
-
URI必须以/开头:'/home'✅,'home'❌(会匹配不到) -
Controller::method不带命名空间前缀,也不加.php:'Home::index'✅,'App\Controllers\Home::index'❌,'Home.php::index'❌ - 占位符传参时,
$1必须跟在方法名后,且控制器方法签名要匹配类型:$routes->get('/post/(:num)', 'Post::view/$1')→ 对应public function view(int $id),漏掉int类型提示会因参数类型不匹配而报错
清除缓存才能让新路由生效
CI4.6.8 默认启用路由缓存,改完 app/Config/Routes.php 后不会自动重载——旧规则还在内存里。
- 执行
php spark cache:clear清空全部缓存(最保险) - 用
php spark routes查看当前已注册的路由列表,确认/home是否出现在输出中 - 如果仍不生效,检查是否意外把新路由写在了
$routes->set404Override()之后——该调用之后的规则全部被忽略
自动加载配置别堆在 Autoload.php 里
所谓“省事”的自动加载,不是把所有 config、helper、library 全塞进 app/Config/Autoload.php,而是按需加载。
- 只在
$config数组里放全站必需的配置(如app、database) - 业务专用 config(如
payment.php)留到控制器里用$this->config->load('payment')手动加载 - 高频自定义类(如
EmailService)写进$classmap,比 PSR-4 自动发现快且稳定 - 改完
Autoload.php或.env后,同样要php spark cache:clear,否则新配置不会生效
CI4 的路由和自动加载机制本身不复杂,但它的“显式优先”原则意味着:你写的每一行都得精准,而且每改一处,都得清缓存验证——这不是 bug,是设计使然。



















