ThinkPHP模板引擎需过三关:安装think-view驱动、路径严格匹配三级结构、assign与fetch链式调用;include/extend路径相对当前模板,开发时应关闭缓存。

新手搭建 ThinkPHP 项目时,模板引擎不是“装上就能用”,而是要过三关:安装对、路径对、调用对。漏掉任一环,轻则变量不显示、模板找不到,重则页面空白或报错 Template not found。下面直说关键点,不绕弯。
模板引擎必须手动安装
ThinkPHP 6.x 默认只带一个极简的 PHP 原生引擎,仅用于错误页。业务模板(支持 {volist}、{extend}、{$var} 等语法)需额外安装 think-view 驱动:
- 在项目根目录执行:
composer require topthink/think-view - 安装后检查 config/view.php 中
'type' => 'think'已生效(不能是 'php' 或空) - 若提示
Call to undefined method think\View::fetch(),说明驱动没加载,重启服务或清 Composer 自动加载:composer dump-autoload -o
模板路径必须严格匹配三级结构
ThinkPHP 按“模块/控制器/操作”自动推导模板路径,大小写和层级都不能错:
- 控制器
app\index\controller\User.php中的index()方法,默认找app\index\view\user\index.html -
view目录必须与app\index同级,不能放在app\view或public\view - 所有目录名全小写(
user≠User),Linux 服务器下大小写敏感,错一个字母就 404 - 跨模块引用要加
@,例如$this->fetch('admin@public/header'),漏掉 @ 就按当前模块找
变量传值必须链式触发渲染
assign() 只是“存数据”,fetch() 才是“取数据+解析+输出”。断链=白传:
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确写法:
$this->assign('title', '首页')->fetch(); - ❌ 错误写法:
$this->assign('title', '首页'); return $this->fetch();(fetch 拿不到刚 assign 的值) - 模板中一律用
{$title},不能写<?php echo $title; ?>(除非配置开启原生 PHP) - 数组不能直接
{$list[0].name},要用{volist name="list" item="vo"}{$vo.name}{/volist}
include 和 extend 路径是相对当前模板的
这是新手最常踩的坑——以为 {include file="header"} 会去 view/public/ 找,其实它只在当前模板同级目录下找:
- 在
view/user/index.html里写{include file="header"}→ 找view/user/header.html - 想包含公共头,必须写全路径:
{include file="public/header"}(从view/开始算) - 使用
{extend name="public/base"}时,base.html必须含{block name="body"}{/block},子模板也要用同名 block 包裹内容,否则整个区域不显示 - 开发阶段建议关闭模板缓存(
config/template.php中设'cache' => false),改完模板立刻生效



















