ThinkPHP视图怎么引入公共头部_ThinkPHP模板include复用介绍【介绍】
ThinkPHP视图中用include标签引入公共头部,路径需基于view_path写相对路径,不可出现./或../。子模板默认无法访问父模板变量,需显式传参或使用assign属性。include模板内不支持{block}块,复杂布局应改用extend。修改后若未生效,需清空模板缓存。
ThinkPHP 视图中引入公共头部,最直接高效的方式就是使用 include 标签——不过呢,路径怎么写、变量怎么传、模板引擎的行为习惯,这些细节要是没摸透,很容易碰上报错或者渲染空白的情况。先说说核心的几个判断。
ThinkPHP 6 的 {include file="xxx"} 路径到底怎么写才正确
ThinkPHP 6 底层用的是 ThinkTemplate 引擎,include 的 file 参数不支持相对路径,比如 ./header.html 这种写法就别想了,也不推荐直接填完整路径。正确的做法,是基于 view_path 配置来写相对路径:
- 公共文件如果放在
app/view/common/header.html,那在任何模板里直接写{include file="common/header"}就行。 - 即使你在子目录里引用,比如
app/view/admin/index.html,写法仍然是{include file="common/header"},别自作主张加../。 - 后缀
.html可以省略,但加上更清晰;如果模板后缀配置成了.php,那自然得写成common/header.php。 - 路径里绝对不能出现
./或../,否则解析会直接失败,返回空内容,而且连个报错提示都不会给——这属于“静默失败”,最让人头疼的那种。
为什么 {include} 里用不到父模板的变量
这个问题非常典型。ThinkPHP 的 include 默认是“局部作用域”,被引入的子模板(比如 header)不能直接访问父模板传进来的数据。解决方案有三种,但各有优劣:
- 显式传参:
{include file="common/header" title="$title" user="$user"},子模板里就能直接用$title了。最推荐,清晰明了。 - 全量继承当前作用域:加上
assign="true"属性,{include file="common/header" assign="true"},但这么做容易造成变量污染,尤其是在多层嵌套include的场景下,调试起来非常痛苦。 - 更稳妥的方案:在控制器里统一用
View::assign()预设好公共变量,比如site_name、na v_list,然后在header.html里直接使用。这样变量来源清晰,维护起来也省心。
include 进来的模板里能用 {block} 吗
结论很明确:不能。ThinkPHP 的 {block} 和 {extend} 是布局继承机制的一部分,只在顶层模板(也就是被 fetch() 渲染的那个)里生效;include 本质上是纯内容拼接,不会触发继承解析。这就意味着:
- 如果在
common/header.html里写了{block name="title"}默认标题{/block},父模板里的{block name="title"}首页{/block}根本覆盖不了它。 - 想实现类似的效果,得改用
{extend name="layout/master"}+{block}的方式重构结构,把 header 放到 layout 模板里,而不是靠include。 - 混用
include和extend很容易把逻辑搞乱,建议二选一:简单复用用 include,复杂布局统一用 extend。
最后提醒一个容易被忽略的点:缓存行为。include 的文件修改之后,如果开启了模板缓存(默认是开启的),可能不会立即生效。这时候需要清空 runtime/view/ 目录,或者在调试阶段临时关闭 template.cache 配置——否则你会纳闷“明明改了,怎么就是没反应”。


































