要在thinkphp5中让子模板正确套用公共布局,必须满足三个硬性条件:父模板存在且路径准确、子模板首行严格写{extend}、父模板里定义了同名{block}。缺一不可,否则页面直接渲染子模板内容,布局完全不生效。

确认布局功能已启用
打开应用配置文件config/template.php,检查是否设置了'layout_on' => true。注意:该配置仅对$this->view->fetch()类底层调用起作用,控制器中常用的return $this->fetch();默认忽略此配置,【不能依赖它触发继承】。
真正起效的方式是——在子模板第一行显式写{extend},而不是靠配置自动套用。
创建基础布局模板
在view/目录下新建一个布局文件,例如view/public/base.html。
文件内容必须包含至少一个命名区块,比如:{block name="content"}默认正文{/block}。没有这个{block},子模板里的同名{block}会被静默忽略,且不报错。
可以在布局中用{include}引入公共片段,如{include file="public/header" /},但注意:这些被include的内容无法被子模板覆盖,只能通过{block}控制可变区域。
子模板继承并填充区块
第一步:在子模板(如view/index/index.html)的第一行、无任何空格、无空行、无PHP注释,写入:{extend name="public/base"}。
第二步:确保name="public/base"中的路径是相对于view_path的,不带后缀;若布局文件是view/layout.html,则写{extend name="layout"}。
第三步:在子模板中定义同名{block},例如{block name="content"}这是首页正文{/block}。这会完全替换父模板中该区块内的所有内容,包括HTML、变量、甚至{include}语句。
如果想保留父模板原有内容并追加,必须在父模板对应{block}内写{__BLOCK__}占位,例如:{block name="script"}{__BLOCK__}<script>initPage();</script>{/block},否则子模板一写{block}就清空全部。
排查常见失效原因
方法一:查看浏览器源码。如果开头就是子模板的HTML(没有布局里的或
方法二:开启调试模式,在日志中搜索think\template\driver\File::read,看是否加载了布局文件路径;没出现即代表路径错误或文件不存在。
方法三:临时把布局文件中所有{block}标签删掉,换成纯HTML再刷新。如果此时能正常显示,问题一定出在{block}名称不一致,比如大小写不符(content ≠ Content)或下划线位置错(main_content ≠ maincontent)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











