codeigniter 3 不支持模板继承,仅能通过多次 load->view() 拼接视图;ci4 支持布局包裹式渲染,需用 view() 返回字符串并传入 layout,不兼容 blade 语法。

CodeIgniter 3 没有原生模板继承机制,所谓“模板继承”只能靠手动拼接或第三方库模拟;CI4 才真正支持基于 view() 和布局(layout)的继承式渲染,但写法和概念跟 Laravel Blade 完全不同——别套用 Blade 思路,否则会卡在 yield 报错或视图空白。
CI3 中“伪模板继承”只能靠多次 $this->load->view()
CI3 的视图系统不支持 @extends 或 @section。你看到的“头部+内容+尾部”结构,本质是控制器里顺序调用三次 $this->load->view():
-
$this->load->view('header')输出<header>...</header> -
$this->load->view('content')输出中间部分,比如<main>...</main> -
$this->load->view('footer')输出
这种写法没有父子关系,只是 HTML 片段拼接。容易踩的坑包括:
- 多个视图里重复写
或,导致嵌套错乱 - 想在
content里传数据给header,得靠$this->load->view('header', $data)二次传参,不能共享变量作用域 - 无法实现“子视图覆盖父视图某区块”,必须把所有可变内容都抽成变量传入
CI4 的 view() 支持布局 + render(),但不是 Blade 风格
CI4 的模板能力集中在 view() 函数和布局文件(layout),核心是用 view('layout', ['content' => view('page')]) 实现包裹,而不是继承语法:
/* app/Views/layouts/main.php */ <title>= $title ?? 'App' ?></title><header>My Site</header><main>= $content ?? '' ?></main><footer>© 2026</footer>
然后在控制器中:
public function index()
{
$data['title'] = 'Dashboard';
$data['content'] = view('dashboard/content'); // 注意:这里必须用 view() 返回字符串
return view('layouts/main', $data);
}
关键点:
-
view()默认直接输出,要用于嵌套必须显式赋值给变量,且确保返回的是字符串(不是 void) - 布局里不能写
@yield('content')—— CI4 不识别 Blade 语法,只认 PHP 原生变量插值 - 如果
view('dashboard/content')里又调用了view(),需确认它没触发输出缓冲冲突(尤其开启 debug 模式时)
CI3 和 CI4 共同的大坑:return vs echo / 直接输出
很多人卡在这一步:写了 layout 视图,但在控制器里用 return view('layout') 后页面空白,或者报 Cannot modify header information。
原因很实际:
- CI3 的
$this->load->view()是直接输出,不能return;想组合就得靠ob_start()+ob_get_clean()手动捕获输出(不推荐) - CI4 的
view()默认也是直接输出,但加第三个参数true可强制返回字符串:view('page', [], true) - 控制器方法必须
return一个响应(字符串、Response对象等),不能混用echo和return
最稳妥做法:CI4 统一用 return view('layout', $data);CI3 就老实用三段 $this->load->view(),别硬套“继承”概念。
真正要注意的不是语法多像 Blade,而是 CI 的视图层从头到尾没打算做模板引擎——它只是个带参数的 PHP 文件包含器。想复用,重点在目录结构(如 views/admin/)、数据封装($data 数组设计)、以及提前加载公共服务(如 CI4 的 BaseController 自动注入 $session),而不是纠结“继承”这个词本身。











