codeigniter 3.1.13 中加载视图的核心方法是 $this->load->view(),需严格按 $view、$vars(必须为数组或对象)、$return(布尔值)顺序传参;$vars 类型错误会导致警告或空白页,$return = true 才可返回字符串用于 ajax;多视图间变量不自动共享,须显式传入或用 $this->load->vars() 全局注入。

直接用 $this->load->view() 就行,但参数顺序和返回行为容易错
CodeIgniter 3.1.13 中加载视图的核心方法就是 $this->load->view(),它接受三个参数:$view(视图路径)、$vars(传入数据)、$return(是否返回字符串而非直接输出)。最常踩的坑是把第二个参数当成布尔值(比如写成 true),其实它应该是数组或对象。
常见错误现象:Notice: Array to string conversion 或页面空白——基本都是因为 $vars 传了非数组/对象类型,比如字符串、true、null。
-
$view是相对application/views/的路径,不带.php后缀,如'user/profile'对应application/views/user/profile.php -
$vars必须是关联数组(如['title' => '首页'])或对象(类属性会自动转为数组键) -
$return是布尔值,默认false;设为true时,方法返回渲染后的 HTML 字符串,不会自动输出
想异步加载视图(比如 jQuery 请求后插入 DOM),必须设 $return = true
如果在按钮点击后通过 AJAX 获取一段 HTML 插入当前页面,控制器不能直接输出视图(那会导致整个页面跳转或响应体混乱),而要返回字符串供前端处理。这时候 $return 参数就关键了。
示例:一个用于弹窗的独立视图 application/views/modals/login_form.php
public function login_modal()
{
$data['next_url'] = $this->input->get('redirect', TRUE) ?: '/';
$html = $this->load->view('modals/login_form', $data, TRUE); // 注意第三个参数是 TRUE
echo $html; // 直接输出字符串,供 AJAX 拿到
}
没加 TRUE 就会直接输出并终止后续逻辑,AJAX 收到的可能是混合响应(比如带 header 输出 + 视图内容),导致解析失败。
多个视图按需加载,数据只传给第一个需要它的视图即可
CodeIgniter 允许连续调用多次 $this->load->view(),每个视图都共享控制器作用域,但变量不会自动跨视图传递——只有你显式传入的那个视图才能访问 $vars 中的数据。
- 如果你在
$this->load->view('header', $data)里传了$data,那么只有header.php能直接用$title;footer.php里没有$title,除非你也给它传 - 若所有视图都需要同一组变量,更稳妥的做法是先调用
$this->load->vars($data)全局注入,再逐个加载视图(无需重复传参) - 子目录层级不影响加载逻辑,但路径中斜杠必须是正斜杠(
/),Windows 下也别用反斜杠
$this->load->view() 不支持模板继承或布局嵌套,得靠手动组合
CI3.1.13 原生不提供类似 Laravel 的 @yield 或 Twig 的 {% extends %},所谓“布局”只能靠控制器手动控制加载顺序和数据分发。
比如实现统一 layout:
// application/views/layouts/main.php <?php $this->load->view($content_view, $content_data); ?>
然后控制器里这么写:
$data['content_view'] = 'user/dashboard';
$data['content_data'] = ['user' => $user];
$this->load->view('layouts/main', $data);
这个模式可行,但要注意:视图文件里不能直接用 $content_view 变量去 include,必须用 $this->load->view() 调用——否则绕过 CI 的路径查找和变量注入机制,$content_data 里的变量在子视图里不可见。
真正容易被忽略的是:视图间无法自动共享变量,哪怕它们被同一个控制器连续加载;每次 view() 都是独立作用域,除非你用 $this->load->vars() 提前注入,或者把数据塞进 $this(不推荐)。











