ThinkPHP 6 默认不启用 ThinkTemplate 引擎,必须手动安装 topthink/think-view 并配置 'type' => 'think',否则 {$var}、{volist} 等标签失效,fetch() 报错因方法由扩展提供而非框架内置。

ThinkPHP 6 默认不启用 ThinkTemplate 模板引擎,必须手动安装 topthink/think-view 并显式配置为 type => 'think',否则 {$var}、{volist} 等标签全部失效,页面只输出原始 HTML。
为什么 fetch() 报错 Call to undefined method thinkView::fetch()
这是典型的模板引擎未加载成功的表现。TP6 原生只支持 PHP 原生模板(即直接写 <?php echo $title; ?>),fetch() 方法由 think-view 扩展提供,不是框架内置。
- 执行
composer require topthink/think-view安装扩展(确认vendor/topthink/think-view目录存在) - 检查
config/view.php中是否仅保留'type' => 'think',删掉config/app.php里任何旧版template配置块 - 运行
composer dump-autoload -o确保类自动加载生效 - 若仍报错,用
dd(class_exists('think\view\driver\Think'))验证驱动类是否可实例化
模板路径报 Template not found 的真实原因
ThinkPHP 按“模块/控制器/操作”三级小写路径匹配模板,且严格区分大小写——这在 Linux 服务器上是硬性规则,Windows 开发环境容易掩盖问题。
- 控制器路径为
appindexcontrollerUser.php,对应模板必须是appindexiewuserindex.html(不是appiewuserindex.html) -
$this->fetch('profile')只会在当前控制器同级 view 子目录找,即user/profile.html,不会向上或跨目录搜索 - 跨模块引用必须带
@符号:$this->fetch('admin@public/header'),漏掉@就变成找当前模块下的admin@public/header - Linux 下
User.php和user.php是两个文件,模板目录名也必须全小写,否则 404
变量传不进去、{$var} 不渲染的常见断点
assign() 只是把数据塞进上下文,真正触发解析的是 fetch() 或 display();链式调用中断、作用域错位、语法写错都会导致变量“消失”。
立即学习“PHP免费学习笔记(深入)”;
- ✅ 正确写法:
$this->assign('title', '首页')->fetch();(链式连贯) - ❌ 错误写法:
$this->assign('title', '首页'); return $this->fetch();(第二次fetch()用的是空上下文) - 模板中必须写
{$title},不能写<?php echo $title; ?>,除非你主动开启原生 PHP 支持(配置'tpl_deny_php' => false) - 数组不能用
{$list[0].name},ThinkTemplate 不支持中括号索引,必须用{volist name="list" item="vo"}{$vo.name}{/volist}
include 和 extend 路径总不对?因为它是相对当前模板的
很多人以为 {include file="public/header"} 是从 view/ 根目录开始找,其实它是以当前模板所在目录为基准——这是嵌套模板时 80% 路径错误的根源。
- 如果当前模板是
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}包裹内容,否则整个区域不显示 - 布局模板中必须有
{__CONTENT__},否则子模板内容无法注入
最易被忽略的是缓存:开发时关掉 cache 只是第一步,更要确认缓存文件生成在 runtime/html/,而不是 runtime/cache/;清缓存必须用 php think clear --template,否则改了模板永远看不到效果。



















