CodeIgniter 的 index 方法不可访问,主因是控制器文件名、类名与路由配置三者不一致,或构造函数未调用 parent::__construct()、_remap() 未显式调用 index() 等流程劫持问题。

index方法访问不到,通常不是路由没配好,而是控制器类本身没通过 CodeIgniter 的方法调用校验机制。
为什么 index 方法不被识别?
CodeIgniter 在执行控制器方法前,会先检查该方法是否“可调用”——它必须是 public、非构造函数、非私有方法,且不能是框架保留名。而 index 本身没问题,问题常出在控制器类名或文件名与 index 所在位置不匹配:
-
application/controllers/Welcome.php中的类必须叫Welcome,且index()是 public 方法;如果类名写成Welcome_controller或Welcom,index就不会被找到 - 若把控制器放在子目录(如
application/controllers/admin/Dashboard.php),但$route['default_controller']写成'admin/Dashboard',而没改Router.php的默认查找逻辑,框架仍只在根 controllers 目录下找Dashboard.php,直接跳过子目录,index自然不可达 - 某些版本(如 3.1.4)对子目录控制器的
index支持有 bug:它尝试加载APPPATH.'controllers/'.$class.'.php',却忽略$this->directory,导致路径拼错
$route['default_controller'] 配错的典型表现
设你写了 $route['default_controller'] = 'home/index';,但实际文件是 application/controllers/Home.php(类名 Home),这时框架会去加载 home.php(小写)——找不到,直接 404,index 根本没机会执行。
- CodeIgniter 默认**区分大小写**加载控制器文件名(Linux 环境下尤其明显)
-
$route['default_controller']值中的第一段是文件名(不含 .php),必须与磁盘上文件名完全一致(包括大小写) - 若控制器在子目录,如
application/controllers/api/v1/Users.php,则应写'api/v1/Users',且确保Users类中定义了public function index()
控制器里重命名 index 会导致什么?
有人为“语义清晰”,把 public function index() 改成 public function home(),然后配路由 $route['default_controller'] = 'Welcome/home'; —— 这会失败,因为 CodeIgniter 的默认方法查找逻辑只认 index,除非你显式指定方法名(如 'Welcome/home' 是合法的,但前提是 home 是 public 方法,且路由规则允许)。
-
$route['default_controller'] = 'Welcome'→ 框架自动调用Welcome::index() -
$route['default_controller'] = 'Welcome/home'→ 框架调用Welcome::home(),但此时已不是“默认方法”,而是显式方法路由 - 若
home()不存在,且没配$route['404_override'],就报 404;即使配了,也进不了index
容易被忽略的初始化陷阱
最隐蔽的问题之一:控制器构造函数里提前 exit()、die(),或未调用 parent::__construct(),导致 $this->load 等核心属性未初始化,后续哪怕 index() 被调到了,执行到 $this->load->view() 就崩出 Undefined property: X::$load 错误,看起来像 index 没运行,其实是运行了但挂了。
- 所有自定义构造函数都必须包含
parent::__construct(); - 不要在
__construct()里做重定向或输出,否则index()永远不会执行 - 若用了
_remap(),它会接管所有方法调用,包括index;如果_remap()里没显式调用$this->index()或对应逻辑,index就静默消失
真正卡住 index 的,往往不是“它没写”,而是“它写了,但框架压根没走到那里”。查的时候别只盯方法名,先确认文件路径、类名、路由字符串三者是否字面一致,再看构造函数和 _remap 是否劫持了流程。











