ThinkPHP 6 模板渲染失败主因是未安装 think-view 扩展、view 配置错误或模板路径不匹配,需检查 type 配置、vendor 包存在性及 view_path 设置。

模板渲染不出来,90% 是没装 think-view 或配置没生效,不是代码写错了。
为什么 fetch() 报错 “Driver [Think] not supported”
ThinkPHP 6 默认只内置 PHP 原生模板引擎,type => 'Think' 这个驱动本身不带在核心里。直接调用 $this->fetch() 或 View::fetch() 就会触发这个错误。
- 必须先执行
composer require topthink/think-view(确保在项目根目录) - 安装后自动注册服务,但前提是
config/view.php中的'type' => 'Think'没被手动改成'php'或其他非法值 - 如果已安装却仍报错,检查
vendor/topthink/think-view是否真实存在;某些 CI 环境或 Docker 容器里可能因缓存或权限导致 autoload 失效
view_path 配置不对,模板根本找不到
默认模板路径是 app/view/,但这个路径由 config/view.php 中的 view_path 决定。很多人改了模块结构或用了多应用,却忘了同步更新这里。
- 若模板放在
app/index/view/,应设为'view_path' => app_path('index') . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR - 留空(
'')时框架会按约定找app/view/,但一旦你启用了多应用(如app/admin/),就必须显式指定 -
view_depr默认是DIRECTORY_SEPARATOR(即/或\),但模板路径字符串里不能混用斜杠,比如$this->fetch('admin\index')在 Linux 下会失败
变量传进去了,但模板里 {$name} 不显示
不是语法写错,而是数据根本没到模板层——常见于用了 assign() 却没调 fetch(),或者用了 view() 助手函数却绕过了当前实例。
立即学习“PHP免费学习笔记(深入)”;
- 控制器中推荐统一用
$this->assign('user', $user)->fetch(),避免新建View实例导致上下文丢失 -
view('index', ['user' => $user])是助手函数,它内部创建新实例并立即fetch,适合简单场景;但若你中间还调了layout()或filter(),就得用$this->view实例链式调用 - 模板中输出变量要加过滤,比如
{$user.name|htmlspecialchars},否则含 HTML 的内容会被浏览器原样解析甚至 XSS;默认过滤需在config/view.php中配'tpl_replace_string'或全局default_filter
布局文件 layout 渲染后 {$__CONTENT__} 为空
这是最隐蔽的问题:布局模板里用了 {$__CONTENT__},但子模板没被正确注入,通常因为路径或命名不匹配。
- 启用布局必须两处一致:
$this->layout('layout')指定的文件名,要和实际存在的app/view/layout.html(或你配的后缀)完全一致 - 子模板不能用
display(),必须用fetch();display()是直接输出,不走布局流程 -
layout文件里必须包含{$__CONTENT__}(注意是双下划线),写成{$CONTENT}或{$content}都不会替换 - 如果开了模板缓存(
tpl_cache => true),改了 layout 文件后要手动删掉runtime/view/下对应缓存文件,否则旧内容一直生效
真正卡住的时候,别猜,直接打开 config/view.php 看 type 和 view_path,再确认 vendor/topthink/think-view 存在且 composer dump-autoload 已执行——大部分“渲染不出来”问题就在这三件事上。



















