thinkphp 6.0 已彻底移除 {extend} 和 {block} 模板继承语法,即使安装 think-template 并配置 'type' => 'think',也不再支持;官方推荐改用 {include} + 变量传值实现组合式复用。

{extend} 在 ThinkPHP 6.0 中**已彻底移除**,不是配置没开、路径写错或语法不熟的问题,而是该语法本身已被框架废弃。如果你在 TP6 项目里写了 {extend name="layout"} 却没生效,不是调试不到位,是它根本不会被解析。
TP6 不再支持 {extend} 和 {block}
ThinkPHP 6.0 起,原生模板引擎(think-template)默认不加载,且 {extend}、{block}、{__BLOCK__} 等继承语法已被硬性删除。运行时遇到会直接报 Parse error: syntax error, unexpected 'extend',或静默跳过(取决于是否启用了兼容层)。
- TP6 默认使用
think-view+think-template分离架构,但think-template需手动安装:composer require topthink/think-template - 即使装了,也必须显式配置
'type' => 'Think',否则仍走默认的Php模板引擎(不支持任何 block 语法) - TP8 已完全弃用
think-template,官方推荐转向Blade或Twig
替代方案:用 {include} + 变量传值模拟继承
TP6 官方推荐的“轻量复用”方式是放弃结构继承,改用组合式包含:
- 把原来
layout.html的内容拆成三部分:header.html、footer.html、main.html(或直接用一个layout.html) - 子模板不再写
{extend},而是用{include file="layout" title="$title" content="$content"} - 在
layout.html中用{$title|default='默认标题'}和{$content}接收并渲染 - 控制器中需提前
$this->assign('title', '用户列表')->assign('content', $this->fetch('user/list')),再return $this->fetch('layout')
常见失效原因与快速定位
页面空白、CSS 不加载、导航栏消失,90% 是因为:
-
{extend}写在了第二行、前面有空格或 PHP 注释——TP6 不报错,但整个标签被忽略 - 路径写成
{extend name="view:layout"}或{extend name="layout.html"}——TP6 要求不带后缀、不加协议前缀,仅name="layout"或name="public/layout" - 父模板没定义
{block name="content"},子模板却写了同名{block}——TP6 不提示,内容直接丢弃 - 开启了
strip_space配置,导致{if}等标签缩进异常,间接影响{include}加载顺序
想保留类似 {{ super() }} 的能力?别指望 TP6 原生支持
TP6 没有 {{ super() }}、没有嵌套继承、不支持跨层级透传 block。所谓“追加 JS”的需求,只能靠手动拼接字符串或在控制器中组合 HTML 片段后 assign 进去。比如:
$js = $this->fetch('user/list_js') . $this->fetch('common/extra_js');
再 assign 给 layout 模板。这不是优雅,是妥协——TP6 的设计哲学就是“模板越 dumb 越好”,逻辑尽量上推到控制器或服务层。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











