thinkphp 6+ 彻底移除 extend/block/parent 模板继承机制,{extend} 语法被解析器拒绝导致报错或空白;须改用 {include} + assign() 显式传参,tp8 还需安装 think-template 并配置 'type' => 'think'。

ThinkPHP 6+ 已彻底移除 extend/block/parent 模板继承机制,所谓“布局文件失效”不是配置没配对,是语法本身已被删除——继续写 {extend name="layout"} 必然报错或静默输出原样。
为什么 {extend} 报 Parse error 或页面空白
这是解析器层面的拒绝:TP6+ 的模板引擎不再识别 extend 这个标签名。常见错误现象包括:
Parse error: syntax error, unexpected 'extend' (T_STRING)- 页面完全空白,日志无记录(因标签被跳过,未进入编译流程)
- 子模板内容全部消失,只剩 layout 中硬编码的部分
根本原因不是缓存没清、路径不对,也不是 view_path 配置问题,而是你正在用一个已不存在的语法。
如何把旧 layout + block 改成 TP6+ 可用写法
必须放弃继承模型,改用显式 {include} + assign() 传参。操作要点:
- 删掉所有子模板首行的
{extend name="layout"} - 把原
{block name="content"}{/block}替换为变量占位,例如{$content|default='默认内容'} - 在子模板顶部用
$this->assign('content', $this->fetch('sub/content'))或直接 assign 字符串 - 布局模板里不再写
{block},而是直接使用{$title}、{$content}等变量 - 原
{parent}调用彻底不可用,需在控制器中拼好完整 HTML 再传入
示例:原 layout.html 中 {% block header %}{% endblock %},现在改为 <header>{$header|raw}</header>,子模板通过 $this->assign('header', '<h1>新标题</h1>') 注入。
TP8 下连 {include} 都不生效?检查 think-template 是否启用
TP8 默认使用原生 PHP 模板(.php 后缀),{include file="xxx"} 这类 ThinkTemplate 语法根本不会被解析——会直接原样输出或报 Call to undefined function think\template\TagLib::parse()。
- 必须手动安装:
composer require topthink/think-template - 安装后,在
config/template.php中显式指定:'type' => 'Think' - 不配置
'type',哪怕装了扩展也完全不生效(截至 2026 年 4 月仍如此) - 确认模板文件后缀是
.html,不是.php;TP8 的原生模式只认.php,ThinkTemplate 模式才认.html
strip_space 开启导致 {if} 缩进失效,别信“压缩 HTML”说法
strip_space 配置开启后,模板引擎会在编译前删除所有空白符,这会导致 {if} 标签与后续 HTML 换行丢失,进而破坏标签闭合逻辑——表现为条件判断失效、嵌套错乱、甚至整个区块不渲染。
- 开发阶段务必关闭:
'strip_space' => false - 上线时 HTML 压缩应交给 Nginx 的
ngx_http_gzip_module或构建工具(如 vite-plugin-html),而非模板层 - 该问题和“模板缓存未更新”无关,清
runtime/view/不能解决
真正容易被忽略的是:TP6+ 的模板行为已不是“升级兼容”,而是“重写替代”。所有基于继承的抽象设计,都得回归到控制器层做结构组装——这不是退步,是把视图职责收窄,避免模板逻辑失控。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











