codeigniter视图组织必须严格匹配文件系统路径,区分大小写且不支持相对路径;公共片段需用true参数捕获输出;模型不能在视图中直接调用;ci4仅识别.php文件,第三方模板需独立初始化。

视图文件组织不是“怎么好看怎么来”,而是围绕加载逻辑、复用性和控制器调用路径展开的——错放一个目录,$this->load->view('admin/dashboard') 就会直接报 404。
子目录结构必须匹配 view() 调用路径
CodeIgniter 不识别“逻辑分组”,只认文件系统路径。比如你把视图放在 application/views/admin/dashboard.php,就必须用 $this->load->view('admin/dashboard')(不带 .php 后缀)。如果写成 $this->load->view('dashboard') 或 $this->load->view('Admin/dashboard'),都会失败。
- 路径区分大小写:Linux 服务器上
admin和Admin是两个不同目录 - 不能跨层级跳转:没有类似
../shared/header这种写法,view()只从application/views/开始解析 - 推荐按控制器名建一级子目录,再按方法名建文件:如
User/profile.php对应User控制器的profile()方法
公共片段(header/footer)必须用 true 参数捕获输出
直接在主视图里写 $this->load->view('header') 再写 $this->load->view('content'),会导致 header 先输出到浏览器,破坏 HTML 结构。正确做法是用第三个参数 true 把内容当字符串返回,再由主模板统一拼接:
$data['header'] = $this->load->view('common/header', $data, true);
$data['footer'] = $this->load->view('common/footer', null, true);
$this->load->view('page/home', $data);
- 漏掉
true会导致页面乱序、CSS/JS 加载失败、甚至空白页 -
common/header中若需动态数据(如用户昵称),必须把$data传进去;而footer若无变量依赖,可传null - 不要在
header.php里再调$this->load->view()—— 容易引发递归或重复加载
模型不能在视图中直接调用,除非已全局加载
你在 header.php 里写 $this->user_model->get_current(),大概率遇到 Undefined property: CI_Loader::$user_model。因为模型加载发生在控制器层,视图本身没权限主动拉取。
- 最稳妥:在控制器构造函数里统一加载,或配置
application/config/autoload.php中的$autoload['model'] - 避免“哪里要用哪里加载”:比如在
home.php里手动$this->load->model('user_model'),违反 MVC 分离原则,且后续调试难定位 - 如果只是读少量静态配置,建议改用
$config或$lang类,它们支持在视图中直接访问
CI4 的 /app/Views/ 路径下不允许出现 PHP 以外的扩展名
CI4 默认只扫描 .php 文件。如果你尝试把 Twig 模板放进去并命名为 layout.twig,$this->load->view('layout.twig') 会静默失败(不报错,但输出空白)。
- 第三方模板引擎(如 Twig)必须独立初始化,不能混用原生
view()方法 - CI4 中子目录层级更深也没问题,如
app/Views/admin/user/list.php→$this->view('admin/user/list') - 注意
APPPATH . 'Views/'是硬编码路径,别试图用符号链接或别名绕过
真正卡住人的从来不是“怎么创建子目录”,而是加载时路径拼错、输出未捕获、模型未就位这三处——它们不出错则已,一出就是白屏或数据丢失,而且错误信息几乎不提示具体哪行代码有问题。











