玩转视图布局:thinkphp使用区块管理技巧【模板篇】
ThinkPHP模板中{block}为覆盖而非填空;{extend}需首行无缩进且路径大小写敏感;保留父内容用{__BLOCK__};layout_on对控制器fetch无效需显式调用;{include}与{extend}混用会使区块失效且无错误提示。
很多人容易把 {block} 当成“填空”来理解,但它在 ThinkPHP 里的行为实际上是“覆盖”——写错一个名称、漏掉 {__BLOCK__}、路径不对,页面就直接变空白,而且连个错误提示都没有。 这可不是危言耸听,从实际项目踩坑的经验来看,这几个点恰恰是最容易翻车的地方。
先说几个核心判断。如果你的布局文件突然不生效,或者某些区块死活加载不出来,原因大概率出在这几个地方。
{extend name="xxx"} 必须严格首行无缩进
模板引擎有个硬性规则:子模板的第一行,只能是 {extend}。一旦前面出现空格、空行,甚至是 PHP 注释(比如 ),整个继承逻辑就会被直接跳过。最终渲染出来的结果,就是子模板原样输出,布局完全失效,而且不报任何错。
{extend}必须顶格写,不能有任何前置字符;- name 值不带后缀,
view/public/base.html对应{extend name="public/base"}; - TP6+ 部分模板驱动要求显式写后缀,如
{extend name="public/base.html"},旧写法可能失效; - 大小写敏感:
content≠Content,配对失败时子模板的{block}会被静默忽略。
{block name="xxx"} 是完全替换,不是追加
这也是一个非常容易踩的坑。父模板中 默认内容{block name="content"},子模板写 {block name="content"}新内容{/block},那默认内容就彻底消失了——这是设计行为,不是 bug。
- 想保留父内容并追加,必须在父模板中用
{__BLOCK__}显式留位,例如:{block name="script"}{__BLOCK__}{/block}; - 子模板里重复定义同一
name的{block},仅最后一个生效; - 父模板没声明
{block name="xxx"},子模板写了也无效,且无任何提示。
layout_on 配置对 return $this->fetch() 无效
很多人在 config/template.php 里设了 'layout_on'=>true,却发现控制器里 return $this->fetch('index'); 根本不套布局——因为该配置只影响底层 fetch() 调用,不直接触发视图层的布局逻辑。
- 正确做法:在控制器中显式调用
$this->view->engine->layout('layout');; - 或改用
{layout name="layout" /}模板标签(ThinkPHP 5+ 支持),写在子模板顶部; - 全局启用 layout 后,个别页面想禁用,需在子模板首行写
{__NOLAYOUT__}。
{include} 和 {extend} 别混着乱用
{include} 是文件包含,{extend} 是模板继承,二者执行阶段不同、作用域隔离。混用不当会导致区块无法覆盖、静态资源重复加载、变量作用域丢失。
{include file="public/header" title="首页" user_name=$user.name}才能传参,父模板变量默认不透传;{include}路径必须是模板目录下相对路径,./header或header.html会 404;- 若布局文件里已用
{block name="header"},就别再{include}同一区域——区块优先级高于 include,容易造成结构断裂。
最常被忽略的点:查看最终 HTML 源码。如果开头就是子模板内容,没出现布局里的 header 或 footer,说明 {extend} 根本没跑起来——这时别查语法,先检查首行、路径、大小写、父模板是否存在同名 block。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















