codeigniter 3 的 $this->load->view() 不支持原生 @section/@yield 语法,因其视图机制仅为 php 文件拼接;需通过手动传参(如 $content)模拟 section,或引入 lex 等轻量模板库,而 ci4 已原生支持 rendersection() 模板继承。

CodeIgniter 3 的 $this->load->view() 不支持原生 section
CodeIgniter 3 默认视图加载机制是纯 PHP 文件拼接,没有 Laravel 那种 @section/@yield 概念。直接写 @section('content') 会报错或被当普通文本输出——这不是配置问题,是框架本身不提供该语法。
用 $this->load->view() 手动传参模拟 section
最轻量、无依赖的做法:把内容区当作变量传进布局视图。布局文件(如 layouts/main.php)里留一个占位点,子视图不直接 echo,而是由控制器统一组装。
示例:
// app/views/layouts/main.php <header>网站头部</header><main><?php echo $content; ?></main><footer>底部</footer>
// app/views/home/index.php <p>这是首页主体内容</p>
// 控制器中
$content = $this->load->view('home/index', [], TRUE); // 第三个参数 TRUE 表示返回字符串而非直接输出
$this->load->view('layouts/main', ['content' => $content]);
- 必须加
TRUE参数,否则$this->load->view()直接输出并返回NULL,导致$content为空 - 子视图里不要写
或,只放业务 HTML 片段 - 如果子视图需要传数据(比如
$data['title']),要先在子视图调用前准备好,再传给$this->load->view()
用第三方模板库(如 Lex, Dwoo)补全 section 功能
如果项目已较复杂,频繁手动拼接 $content 易出错且难维护,可引入轻量模板引擎。推荐 Lex(专为 CI 设计,无 Composer 依赖):
- 下载
Lex.php放到application/libraries/ - 在控制器中:
$this->load->library('lex'); - 布局文件用
{block:content}{/block},子视图用{extends:layouts/main}{block:content}...{/block} - 注意 Lex 不解析 PHP 代码,所有逻辑需在控制器完成,视图只负责展示
它比 Twig 轻、比原生 view 更结构化,但会多一层学习成本——小项目不建议引入。
CI4 已原生支持类似 section 的 renderSection()
如果你用的是 CodeIgniter 4,直接用内置的模板继承机制即可:
<!-- app/Views/layouts/main.php -->
<header>头部</header><main>= $this->renderSection('content') ?></main>
<!-- app/Views/home/index.php -->
= $this->extend('layouts/main') ?>
= $this->section('content') ?>
<p>首页内容</p>
= $this->endSection() ?>
CI4 的 section 是运行时解析的,不依赖额外库,但要注意:控制器里不能用 return view() 同时又手动 echo;必须统一走 return view('home/index'),框架自动处理继承链。
真正容易被忽略的是:CI3 和 CI4 的“section”本质不同——前者是用户模拟的变量传递,后者是引擎级模板继承。选哪种,取决于你是否愿意升级框架或引入外部依赖。











