应按“功能模块+视图类型”两级组织:app/Views/user/下放list.php、detail.php等,app/Views/auth/下放login.php、register.php等,公共片段抽至partials/,布局统一放layouts/,提升可读性、IDE跳转效率及维护性。

app/Views 目录里文件太多,怎么避免 index.php 和 user_list.php 混在一起?
直接把所有视图丢进 app/Views/ 是 CI 3 默认做法,但项目一过 10 个页面就难找、难维护。核心问题不是“能不能放”,而是“谁该负责哪块视图”。真实项目中,user_list.php 和 dashboard.php 的使用者、更新频率、依赖的 JS/CSS 都不同,硬塞一起只会让 git diff 变得混乱、新人不敢动。
推荐按「功能模块 + 视图类型」两级组织:
-
app/Views/user/下放list.php、detail.php、form.php -
app/Views/auth/下放login.php、register.php、reset_password.php - 公共部分单独抽到
app/Views/partials/(如header.php、sidebar.php) - 全局布局统一用
app/Views/layouts/default.php,避免每个视图都重复写结构
为什么不能直接用 view('user/list') 而要加子目录?
CI 的 view() 函数默认支持斜杠路径,但关键在「可读性」和「IDE 支持」。写 view('user/list') 时,编辑器能直接跳转到 app/Views/user/list.php;而写 view('user_list') 就得靠记忆或全局搜索——尤其当有 user_list.php、user_list_modal.php、user_list_print.php 时,名字冲突风险高。
另外,CI 3.1+ 的自动加载机制对带斜杠的路径识别更稳定。某些自定义钩子或缓存层(如 output_cache)在匹配视图名时,会把 user_list 当作单个字符串处理,而 user/list 明确表达了层级关系,减少歧义。
partials 和 layouts 怎么分?容易搞混的边界在哪?
最常踩的坑是把「可复用 UI 片段」和「页面骨架」混为一谈。简单判断标准:
-
app/Views/partials/:不包含或,只负责局部渲染,比如app/Views/partials/alert_message.php,它被include进其他视图,本身不独立访问 -
app/Views/layouts/:必须包含完整 HTML 结构,且通过$this->load->view()或view()的第二个参数传入内容,例如view('layouts/default', ['content' => $content]) - 别把
app/Views/partials/里的文件直接用view('partials/header')调用——它不是入口视图,没有上下文安全校验,容易暴露未初始化变量
CI 4 的 Views 目录结构要不要照搬 CI 3 的习惯?
CI 4 把视图路径从 APPPATH . 'Views/' 改成 APPPATH . 'Views/'(没变),但引入了命名空间和主题支持,实际影响不大。真正要注意的是:CI 4 默认启用 ViewRenderer,它对路径大小写更敏感,且不自动 fallback 到根目录。比如你写了 view('User/list'),但文件实际在 app/Views/user/list.php,就会报 Unable to locate the view file 错误。
所以迁移或新建 CI 4 项目时,建议:
- 保持小写目录名(
user/不用User/) - 避免在视图路径里用大驼峰(
view('UserProfile/edit')→ 改成view('user_profile/edit')) - CI 4 的
view()第二个参数强制要求是数组,别传对象,否则可能静默失败
复杂点在于跨模块复用——比如订单页要嵌入用户头像组件,这个 partial 放哪?答案是:放在 app/Views/partials/user/avatar.php,而不是订单目录下。否则用户模块改头像逻辑时,订单页就断了。边界感比目录名重要得多。


















