thinkphp模板需按模块/控制器/操作三级路径存放,如app\index\view\user\index.html;变量须通过assign()链式调用fetch()才生效,模板中用{$title}取值。

模板文件怎么放才被自动找到
ThinkPHP 默认按模块+控制器+操作三级路径匹配模板,比如 app\index\controller\User.php 里的 index() 方法,默认渲染 app\index\view\user\index.html。路径写错、大小写不一致或没建对应目录都会报 Template not found 错误。
- 确保
view目录在模块同级(不是app\view),且命名全小写(Windows 可能不敏感,Linux 会直接 404) - 如果用
$this->fetch('profile'),它找的是当前控制器目录下的profile.html,不是根view下的 - 跨模块调用要写全路径,比如
$this->fetch('admin@public/header'),中间的@不能漏
assign() 传参后模板里为什么取不到变量
最常见原因是变量名冲突或作用域没生效:assign() 是链式调用,但必须以 fetch() 或 display() 结尾才算真正触发渲染;中间漏掉 return 就白传了。
-
$this->assign('title', '首页')->fetch();✅;$this->assign('title', '首页'); fetch();❌(没链上,fetch()用的是空上下文) - 模板里用
{$title},不是<?php echo $title; ?>—— ThinkPHP 模板引擎默认关闭 PHP 原生语法,除非配置了'tpl_replace_string' => ['{php}' => '<?php '] - 数组传入后要在模板用
{volist name="list" item="vo"}{$vo.name}{/volist},直接{$list[0].name}会报错,因为模板语法不支持中括号索引
include 和 extend 怎么避免路径错误
{include file="public/header"} 和 {extend name="public/base"} 都是相对当前模板所在目录解析路径,不是相对于 view 根目录。这点和很多人直觉相反,也是嵌套时路径崩掉的主因。
ShopMX采用.NET+MSSQL进行开发,拥有先进的标签技术和模板引擎,通过网站后台可轻松制作适合客户使用的模板样式,只需要懂得简单网页制作的朋友就可以轻松制作属于自己独特风格的商城系统。 二、功能概要 (一)、前台功能说明 商品分类、特价商品、推荐商品、最新特价商品、热卖商品、商城公告、商城资讯、热门评论、畅销推荐、资讯订阅、产品目录、会员助手、商品搜索、收藏商品、分享商品、
-
{include file="header"}在user/index.html里,会去找view/user/header.html,不是view/public/header.html - 想跨目录包含,必须写全:
{include file="public/header"}(从view开始算) -
{extend name="public/base"}的base.html必须含{block name="body"}{/block},子模板用{block name="body"}...{/block}覆盖,漏掉{block}标签会导致内容不显示
模板缓存关不关?什么时候清
开发阶段建议关缓存,否则改了模板看不到效果;上线后开缓存能省 20%+ 渲染时间。缓存开关在 config/template.php 的 'cache' => true,但更关键的是缓存文件位置和清理时机。
立即学习“PHP免费学习笔记(深入)”;
- 缓存文件默认生成在
runtime\html\,不是cache目录,清缓存时别清错地方 -
php think clear --template只清模板缓存;如果改了配置但页面还是旧的,可能是因为runtime\temp\下的编译缓存也得一起清 - 启用
'strip_space' => true会压缩 HTML 空格,调试时建议关掉,否则看源码难定位问题
模板路径拼接、变量作用域、缓存位置——这三个点不盯住,90% 的模板问题都出在这儿。










