页面空白或变量不显示的根源在于输出链未走通:assign()仅存数据不输出,需确认控制器继承think\Controller、避免同名覆盖、传值非空;fetch()必须执行且成功返回;模板路径正确、缓存已清、编码为UTF-8无BOM;用{: $var}和dump()验证变量真实存在。

模板变量写对了、$this->assign()也调了,但页面就是空白或变量不显示——这不是语法错了,而是几个关键环节卡住了输出链。重点不在“怎么写”,而在“有没有走通”。
确认 assign() 真正生效了
assign() 只是把数据存进当前视图容器,它本身不产生任何输出。
- 检查控制器是否继承
think\Controller,否则$this->assign()会报“undefined method”错误 - 避免多次同名赋值:
$this->assign('list', $a)后又写$this->assign('list', $b),后者会完全覆盖前者 - 留意中间件或父类里是否悄悄执行了同名 assign,你写的可能被静默替换了
- 传
null、空字符串''或false时,{$list}默认不渲染(无报错、无声无息),换成{: $list}就能立刻看到值
fetch() 必须被调用且成功返回
没 fetch,再好的数据也出不来。这是最常被忽略的一步。
- 控制器方法结尾必须有
return $this->fetch();、return view('index');或return View::fetch('index'); - 如果中间写了
exit、die、redirect()或抛出未捕获异常,fetch 就不会执行到底 - 使用
view('index', [...])是推荐写法,它内部自动完成 assign + fetch,比分开写更可靠 - 确保模板文件真实存在:路径是
app/view/控制器名/方法名.html(如app/view/index/index.html),不是随便放个index.html就行
模板缓存和编译文件干扰输出
改了模板却没变化?大概率是旧缓存还在运行。
立即学习“PHP免费学习笔记(深入)”;
- 开发阶段务必关闭模板缓存:
config/view.php中设'cache' => false - 删干净
runtime/view/目录下所有文件(不要只删某一个,缓存文件名含哈希,手动清不全) - 检查模板编码是否为 UTF-8 无 BOM,BOM 会导致前置空白,有时被浏览器截断或 CSS 隐藏
- 如果用了 layout 布局或 include 包含,改动子模板后主模板缓存也可能未更新,一并清理更稳妥
验证变量是否存在,绕过默认过滤
别只信 {$name},它做了 HTML 转义 + 空值过滤,容易误判。
- 在模板中临时改成
{: $name},直接输出原始值,能立刻区分是“没传过来”还是“被过滤了” - 用
{: dump($name)}查看变量结构和类型(注意:生产环境禁用 dump) - 系统变量如
{$Think.get.id}不依赖 assign,但受路由和运行环境影响,不稳定时建议在控制器里用$this->assign('get_id', input('get.id'))显式传入



















