codeigniter通过多次$this->load->view()手动拼装header/footer等视图,避免在视图中使用include;推荐用$this->load->vars()预设公共变量,并在基控制器中统一处理权限与数据初始化,确保header等复用视图可靠稳定。

直接用 $this->load->view() 拆分 header/footer
CodeIgniter 没有“布局模板”原生概念,但完全可以通过多次 $this->load->view() 手动拼装。核心思路是:把 header.html、content.html、footer.html 当作独立视图文件,按需加载。
常见错误是试图在视图里用 include 或 require 引入其他 PHP 文件——这会绕过 CI 的视图加载机制,导致无法传递数据、无法使用 $this、路径解析错乱。
-
application/views/common/header.php和footer.php保持纯 HTML/PHP 输出,不带<?php $this->load->view() ?>嵌套 - 控制器中按顺序调用:
$this->load->view('common/header');→$this->load->view('user/list', $data);→$this->load->view('common/footer'); - 如果需要向
header传参(比如动态 title),统一打包进一个数组传给所有子视图,或用$this->load->vars()预设全局变量
用 $this->load->vars() 统一注入公共变量
每次都在每个 load->view() 调用里重复传 $data 很麻烦,尤其 header/footer 几乎总要读取 $title、$current_user 这类字段。
$this->load->vars() 是更轻量的替代方案:它把变量注入到后续所有视图作用域,无需显式传参。
- 在控制器方法开头调用:
$this->load->vars(['title' => '用户列表', 'logged_in' => true]); - 然后
header.php里可直接用$title,footer.php里可用$logged_in,不用改任何 view 调用逻辑 - 注意:它只对当前请求生命周期有效,不会污染其他请求;但如果在循环中反复调用
vars(),后一次会覆盖前一次同名变量
路由或权限变化时 header 动态判断失效怎么办
很多人把登录状态、菜单高亮逻辑硬写在 header.php 里,结果发现某些控制器没加载用户信息,$current_user 未定义就报 Notice。
根本原因是:header 是被动加载的,它不感知上下文。不能指望它自己去查 session 或 model。
- 必须由控制器提前准备好所有 header 需要的变量,并确保它们始终存在(哪怕只是默认值)
- 例如:
$data['current_user'] = $this->session->userdata('user') ?: [];,避免 header 中if ($current_user['id'])直接崩掉 - 更稳妥的做法是封装一个
get_header_data()方法,在基控制器里统一处理权限、菜单、SEO 字段等,再交给vars()
为什么不用第三方模板库(如 Sparks、Twig)
CI 社区确实有模板扩展,但实际项目中引入反而增加维护成本:
- 多数模板库依赖已废弃的 Sparks 包管理器,或与 CI 3.1+ 的 autoloader 冲突
- Twig 在 CI 中需手动配置自动加载、缓存路径、模板继承链,出错时调试路径远比原生
load->view()复杂 - 真正需要“区域复用”的场景,靠
common/header+vars()+ 基控制器预处理,已足够清晰可控
拆 header 不是目标,让 header 可靠、可测、不随 controller 变化而意外失效,才是关键。变量是否被初始化、是否被覆盖、是否在所有路径下都存在——这些细节比“怎么拆”更值得盯紧。











