如何高效运用ThinkPHP模板引擎标签语法进行视图渲染?
- 内容介绍
- 文章标签
- 相关推荐
本文共计944个文字,预计阅读时间需要4分钟。
ThinkPHP 默认使用模块/控制器/操作的方式进行三级目录查找模板,例如:
- 目录名全小写(Linux 下大小写敏感,
User和user是两个路径) -
view目录必须和模块目录同级(即app\index\view,不是app\view) - 用
$this->fetch('profile')时,它只在当前控制器同级的 view 子目录里找,比如user/profile.html,不会去public/或根view/ - 跨模块引用必须带模块前缀和
@符号,例如$this->fetch('admin@public/header'),漏掉@就失效
assign() 传参后模板里取不到变量?链式断了或没触发渲染
assign() 只是把数据塞进上下文,真正触发模板解析的是 fetch() 或 display()。常见错误是写了 assign() 却忘了返回 fetch():
- ✅ 正确:
$this->assign('title', '首页')->fetch(); - ❌ 错误:
$this->assign('title', '首页'); return $this->fetch();—— 这里fetch()拿到的是空上下文,因为没链上 - 模板里必须用
{$title},不能写<?php echo $title; ?>,除非你手动开启了原生 PHP 支持(配置'tpl_replace_string' => ['{php}' => '<?php ']) - 数组要遍历,不能直接
{$list[0].name}—— 模板语法不支持中括号索引,得用{volist name="list" item="vo"}{$vo.name}{/volist}
{include} 和 {extend} 的路径都是相对当前模板,不是 view 根目录
这是嵌套模板时最常踩的坑。例如在 view/user/index.html 里写 {include file="header" /},ThinkPHP 会去找 view/user/header.html,而不是你预期的 view/public/header.html。
- 想包含公共部分,必须写全路径:
{include file="public/header" /} -
{extend name="public/base"}中的base.html必须含{block name="body"}{/block}占位;子模板里也要用同名{block name="body"}{/block}包裹内容,否则整个 block 区域不显示 - 如果用了 layout 模式(
'layout_on' => true),记得创建view/layout.html并放好{__CONTENT__}
缓存关不关?清哪里?别清错 runtime/html/
开发阶段务必关掉模板缓存,否则改了 .html 文件根本看不到效果。开关在 config/template.php 的 'cache' => false。但更关键的是缓存文件位置:
立即学习“PHP免费学习笔记(深入)”;
- 模板缓存默认生成在
runtime/html/,不是runtime/cache/或runtime/log/ - 执行
php think clear --template才能清干净;只删runtime/全目录也行,但太粗暴 - 上线后开缓存可省约 20% 渲染时间,但要注意:改了模板后必须清缓存,否则用户看到的还是旧 HTML
- 如果开了缓存但页面始终不更新,先检查
runtime/html/权限是否可写,再确认是否真清掉了对应文件(文件名含哈希,不是按模板名直出)
路径、链式调用、相对包含、缓存位置——这四个点只要错一个,模板就挂得无声无息。尤其注意 Linux 环境下大小写和路径层级,Windows 开发完直接扔到服务器跑不通,大概率栽在这儿。
本文共计944个文字,预计阅读时间需要4分钟。
ThinkPHP 默认使用模块/控制器/操作的方式进行三级目录查找模板,例如:
- 目录名全小写(Linux 下大小写敏感,
User和user是两个路径) -
view目录必须和模块目录同级(即app\index\view,不是app\view) - 用
$this->fetch('profile')时,它只在当前控制器同级的 view 子目录里找,比如user/profile.html,不会去public/或根view/ - 跨模块引用必须带模块前缀和
@符号,例如$this->fetch('admin@public/header'),漏掉@就失效
assign() 传参后模板里取不到变量?链式断了或没触发渲染
assign() 只是把数据塞进上下文,真正触发模板解析的是 fetch() 或 display()。常见错误是写了 assign() 却忘了返回 fetch():
- ✅ 正确:
$this->assign('title', '首页')->fetch(); - ❌ 错误:
$this->assign('title', '首页'); return $this->fetch();—— 这里fetch()拿到的是空上下文,因为没链上 - 模板里必须用
{$title},不能写<?php echo $title; ?>,除非你手动开启了原生 PHP 支持(配置'tpl_replace_string' => ['{php}' => '<?php ']) - 数组要遍历,不能直接
{$list[0].name}—— 模板语法不支持中括号索引,得用{volist name="list" item="vo"}{$vo.name}{/volist}
{include} 和 {extend} 的路径都是相对当前模板,不是 view 根目录
这是嵌套模板时最常踩的坑。例如在 view/user/index.html 里写 {include file="header" /},ThinkPHP 会去找 view/user/header.html,而不是你预期的 view/public/header.html。
- 想包含公共部分,必须写全路径:
{include file="public/header" /} -
{extend name="public/base"}中的base.html必须含{block name="body"}{/block}占位;子模板里也要用同名{block name="body"}{/block}包裹内容,否则整个 block 区域不显示 - 如果用了 layout 模式(
'layout_on' => true),记得创建view/layout.html并放好{__CONTENT__}
缓存关不关?清哪里?别清错 runtime/html/
开发阶段务必关掉模板缓存,否则改了 .html 文件根本看不到效果。开关在 config/template.php 的 'cache' => false。但更关键的是缓存文件位置:
立即学习“PHP免费学习笔记(深入)”;
- 模板缓存默认生成在
runtime/html/,不是runtime/cache/或runtime/log/ - 执行
php think clear --template才能清干净;只删runtime/全目录也行,但太粗暴 - 上线后开缓存可省约 20% 渲染时间,但要注意:改了模板后必须清缓存,否则用户看到的还是旧 HTML
- 如果开了缓存但页面始终不更新,先检查
runtime/html/权限是否可写,再确认是否真清掉了对应文件(文件名含哈希,不是按模板名直出)
路径、链式调用、相对包含、缓存位置——这四个点只要错一个,模板就挂得无声无息。尤其注意 Linux 环境下大小写和路径层级,Windows 开发完直接扔到服务器跑不通,大概率栽在这儿。

