发布于2026-07-11 阅读(0)
扫一扫,手机访问
ThinkPHP 视图中引入公共头部,最直接高效的方式就是使用 include 标签——不过呢,路径怎么写、变量怎么传、模板引擎的行为习惯,这些细节要是没摸透,很容易碰上报错或者渲染空白的情况。先说说核心的几个判断。
{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 里直接使用。这样变量来源清晰,维护起来也省心。{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 配置——否则你会纳闷“明明改了,怎么就是没反应”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8