Template compile error或unexpected '{'是模板引擎编译失败,非PHP解析错误;主因是标签未闭合、嵌套错乱、混入未转义字符或自定义标签未注册,需查原始模板及清理双层缓存。

模板编译报错:Template compile error 或 unexpected '{'
这类错误不是 PHP 解析失败,而是 ThinkPHP 模板引擎在把 {volist}、{if} 等标签转成 PHP 代码时卡住了。它根本没走到运行阶段,所以 var_dump() 和日志里看不到变量值。
最常见诱因是标签未闭合或嵌套错乱:
- {volist name="list"} 之后漏了 {/volist},尤其在复制粘贴后容易丢掉末尾
- {if} 块里混入了未转义的
{字符,比如写 {$user.name} 时误写成 {$user{name}}(PHP 7.4+ 已弃用语法) - 在 {literal} 标签内部又写了 {volist} —— 此区块会被原样输出,内层标签完全不解析
- 自定义标签如
<auth></auth>没提前<load href="My"></load>,导致整个 XML 块被当作文本透传
定位方法:看报错堆栈里提到的临时文件路径,比如 runtime/view/xxx.tpl.php;这个文件是编译结果,但出错时往往只生成一半。真正要查的是原始模板(如 index.html)中最近修改的那几行。
首页空白或只显示键名(如 welcome)
这说明语言包或模板函数根本没加载成功,不是语法问题,而是执行链断了。
立即学习“PHP免费学习笔记(深入)”;
先在控制器里硬测,别信模板:
-
dump(Lang::getLangSet())返回空?→ 语言侦测失败,检查config/lang.php中'detect_var' => 'lang'和请求是否带?lang=zh-cn -
dump(lang('welcome'))返回'welcome'?→ 语言包未加载,确认app/lang/zh-cn.php存在且命名严格为小写连字符(Linux 下zh_CN.php≠zh-cn.php) -
dump(file_exists(app()->getLangPath() . 'zh-cn.php'))为 false?→ 路径拼错了,app()->getLangPath()输出的是绝对路径,不是相对路径
模板里写 lang('welcome') 生效的前提是:文件后缀必须是 .php(不是 .html),且必须用 = lang('welcome') ?> 或 <?php echo lang('welcome'); ?>,不能只写 <?php lang('welcome'); ?> 却不输出。
缓存清理不彻底导致“改了也不生效”
ThinkPHP 的模板缓存是双层结构:一层是 runtime/view/ 下的编译 PHP 文件,另一层是 runtime/Temp/ 下的哈希映射表(template_*.php)。只删 view/ 目录,旧映射仍存在,框架会跳过重新编译,继续执行损坏的缓存文件。
开发环境务必同步清理:
- Linux/macOS:
rm -rf runtime/view/* runtime/Temp/* - Windows:手动清空
runtime/view和runtime/Temp两个文件夹下所有内容(包括子文件夹) - 同时关闭模板缓存:
config/view.php中设'cache' => false
注意:TP6 没有 php artisan view:clear 这种命令,那是 Laravel 的,执行了也没用。
{volist}/{if} 在首页嵌套失效或变量取不到
TP6 对标签属性名大小写敏感,且对嵌套层级有硬限制,默认最多 3 层(由 template.taglib_level 控制)。超出即静默跳过,不报错也不输出。
典型问题:
-
{volist name="list" KEY="item"}→KEY必须小写,写成大写或index都无效 - 外层
{volist name="users" id="user"},内层再写{volist name="users" id="sub"}→ 内层会覆盖外层$user,最终只渲染最后一组数据 - {switch} 内部直接写 {volist} → 不支持,会静默丢弃,改用 {if}/{elseif} 更稳妥
- 需要三层以上嵌套(如循环 → 判断 → 循环),必须显式配置
'taglib_level' => 5,否则第二层之后的标签不解析
变量作用域容易被忽略:id 和 key 的值必须是合法 PHP 变量名(不能含点、中划线),否则 $item.status 可能被误拆成两个变量,导致解析中断。



















