thinkphp6.x模板布局机制核心是复用重复结构,推荐三种方式:{include}适用于小项目局部复用;{extend}+{block}适合中大型项目分层维护;全局layout适用于全站统一风格的后台系统。

ThinkPHP6.x 的模板布局机制,核心目标是把重复的结构(比如头部导航、底部版权、侧边栏)抽离出来,实现一次编写、多处复用。关键不在于“能不能做”,而在于选对方式——{include} 适合简单复用,{extend}+{block} 适合分层清晰、长期维护的项目,全局 layout 则适合全站风格统一的后台或企业站。
用 {include} 快速引入公共头尾
这是最直接的方式,适合小项目或局部复用:
- 路径必须是模板目录下的相对路径,例如
{include file="public/header" /}对应view/public/header.html - 支持绝对路径写法:
{include file="/common/footer" /}表示从view/根目录开始找 - 跨模块引用需加模块名前缀,如
{include file="admin@public/header" /}(仅当 admin 模块存在且已注册) - 别写
./header或header.html,这类写法会去当前模板同级目录找,极易静默失败 - 传参要用键值对形式,例如
{include file="public/header" title="用户中心" is_login=$is_login /},子模板中可直接用{$title}
用 {extend}+{block} 实现可继承的布局结构
更适合中大型项目,逻辑清晰、扩展性强,避免嵌套 include 导致的作用域混乱:
- 先创建一个基础布局模板,比如
view/layout/base.html - 在其中定义多个 block,如
{block name="head"}{/block}、{block name="content"}{/block}、{block name="script"}{/block} - 具体页面模板开头写
{extend name="layout/base" /},再用{block name="content"}...{/block}填充主体内容 - 每个 block 都支持默认内容和子模板覆盖,父模板里写
{block name="title"}默认标题{/block},子模板可重写它 - 静态资源路径仍需注意:CSS/JS 的
href和src必须以/开头,或使用{__STATIC__}动态前缀,否则请求会相对于当前 URL 而非模板位置
开启全局 layout 布局统一渲染流程
适用于全站共用同一套首尾和结构的场景,比如后台管理系统:
- 在
config/view.php中启用:'layout_on' => true,并指定'layout_name' => 'layout' - 在
view/layout.html中写入公共结构,中间放{__CONTENT__}占位符 - 典型写法:
{include file="public/header" /}{__CONTENT__}{include file="public/footer" /} - 该配置对所有模板生效,如个别页面(如登录页)不需要布局,可在控制器中临时关闭:
View::config(['layout_on' => false]); - 注意:静态资源路径在 layout.html 中也要规范,不能用
./css/app.css,得写成/static/css/app.css或{__STATIC__}/css/app.css
静态资源路径与作用域常见避坑点
头尾引入后样式丢失、JS 报 404,90% 不是模板语法问题,而是路径解析机制导致:
- HTML 中的
<link href="css/style.css">是按浏览器当前 URL 解析的,不是按模板文件位置;所以必须用绝对路径或{__STATIC__} - {include} 默认不继承父模板全部变量,显式传参比
assign="true"更安全,后者容易引发嵌套污染 - 复杂数据(如用户菜单数组)建议在控制器提前
$this->assign('menu_list', $data),再通过{include file="public/header" menu_list=$menu_list /}传入 - 模板后缀可省略,但显式写出更稳妥;若你改过模板后缀为
.php,就得写成{include file="public/header.php" /}
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











