适合用 CodeIgniter view layout 的页面包括普通内容页、后台管理页、多语言或主题切换页;不适合单页应用前端路由页、纯 JSON 接口页、PDF/邮件等独立模板页。

哪些页面适合用 CodeIgniter view layout
view layout 不是框架内置功能,而是开发者手动组织视图结构的常见模式(比如用 $this->load->view('templates/header') + 主内容 + $this->load->view('templates/footer'))。它适合那些「结构重复、内容局部变化」的页面。
- 普通内容页:用户列表页、文章详情页、设置页——头部、导航、侧边栏、底部几乎一致,仅中间区域不同
- 后台管理页:所有路由都共享同一套 admin layout(含菜单栏、面包屑、权限控制区域)
- 多语言或主题切换页:layout 中通过
$this->lang->line()或$theme变量统一注入文案或样式路径,子视图只管业务逻辑
不适合的场景包括:
- 单页应用(SPA)的前端路由页(如 Vue/React 接入时,CI 只做 API,layout 由前端接管)
- 极简接口响应页(如返回纯 JSON 的
api/v1/user),压根不需要 HTML 结构 - 需要完全独立渲染逻辑的页面(如 PDF 导出模板、邮件正文模板),它们通常绕过 layout 直接加载专属视图
为什么不能把所有页面都塞进同一个 layout
硬套 layout 容易导致三类问题:
- 数据传递混乱:
$data数组在 controller 中需为每个子视图补全 layout 所需字段(如'title'、'user_name'、'unread_count'),漏传一个就让整个 layout 报 Notice 或空白 - 条件逻辑膨胀:layout 里堆满
if ($this->session->has_userdata('admin'))、if (isset($show_sidebar)),很快变成难以维护的判断嵌套 - 性能隐性损耗:即使某个页面不需要左侧菜单,layout 仍会执行
$this->load->view('partials/sidebar'),而该视图可能又去查数据库或调用 helper 函数
更稳妥的做法是按角色/场景拆 layout:
-
layouts/main.php:面向访客的通用结构(含登录入口、静态导航) -
layouts/admin.php:后台专用,预加载权限判断与系统通知 -
layouts/email.php:纯内联样式、无 JS、table 布局,专供email_template类使用
如何让 layout 支持动态 title 和 meta
CodeIgniter 本身不提供视图级 set_title() 方法,得靠约定传递:
- controller 中统一用
$data['page_title'] = '用户管理';,layout 里写<title><?php echo isset($page_title) ? $page_title : '默认标题'; ?></title> - 若需多级标题(如「用户管理 » 编辑 ID=123」),建议在 controller 中拼好再传,避免 layout 里做字符串处理
- meta 描述和关键词同理,但注意不要在 layout 里硬编码
name="description",否则所有页面 SEO 元素一模一样
容易忽略的一点:$data 是 PHP 数组,传入 layout 后所有键都变成变量名。如果子视图也定义了 $title,且未加前缀,就会覆盖 layout 里同名变量——所以推荐统一用带命名空间的键,比如 'layout_title'、'layout_scripts',降低冲突风险。


















