thinkphp 5.1 中必须使用 {include} 标签引入视图模板,路径须为 view_path 内相对路径或以 / 开头的绝对路径,不支持 ../ 跳级;无法直接引入 public/ 下文件,需移至 view/ 或用 file_get_contents() + raw;view_replace_str 不影响 {include} 路径;多应用需统一 view_path 或抽离公共模板;修改 include 文件后需清除模板缓存。

ThinkPHP 5.1 中不能直接用 include 或 require 引入视图模板文件,必须用内置标签 {include},且路径必须是模板路径内相对位置或以 / 开头的绝对路径(从 view_path 根起算),否则会报错或静默失败。
使用 {include} 标签引入同级或子目录下的模板文件
TP5.1 的 {include} 是 ThinkTemplate 编译型引擎的原生标签,不是 PHP 的 include。它只在模板编译阶段解析,路径基于当前应用的 view_path 配置,不走 PHP 文件系统。
- 假设
view_path = 'view/'(默认),当前模板是view/index/index.html,想引入同目录下的_header.html,写法是:{include file="index/_header"}(注意不含扩展名,也不加.html) - 若要引入上层目录的公共模板(如
view/common/_footer.html),需写全路径:{include file="common/_footer"} - 不能写成
{include file="../common/_footer"}—— 相对路径向上跳级不被支持,会编译失败 - 如果模板文件带参数,可传入:
{include file="widget/user_card" username="$user.name" avatar="$user.avatar"}
引入 public/ 下的 HTML 片段需绕过 {include} 机制
{include} 只能加载 view_path 内的模板文件,无法直接读取 public/ 下的纯 HTML(比如 public/_meta.html)。强行用 {include file="/public/_meta"} 会报 template not exists 错误。
- 正确做法是把这类公共 HTML 片段移到
view/目录下(如view/common/_meta.html),再用{include file="common/_meta"} - 若必须保留在
public/,可用file_get_contents()+raw输出(仅限内容可信、无变量插值场景):{:raw(file_get_contents(ROOT_PATH.'public/_meta.html'))} - 注意:
ROOT_PATH指项目根目录,public/在其下;但该方式无法解析模板语法(如{$name}),仅作静态内容插入
view_replace_str 不影响 {include} 路径,但可用于静态资源 URL 替换
view_replace_str 是模板输出前的字符串替换规则,只作用于 HTML 文本内容,对 {include} 的 file 属性完全无效。别指望用 __PUBLIC__/header 这种写法做模板引入。
- 它真正有用的地方是静态资源链接,例如配置:
'__STATIC__' => '/static',然后在模板中写:<link href="%7B__STATIC__%7D/css/app.css"> - 错误示例:
{include file="__PUBLIC__/header"}—— 这不会被替换,引擎直接按字面量去view/下找名为__PUBLIC__/header的文件,必然失败 - 调试技巧:开启
app_debug = true后,模板编译失败会在日志里明确提示“template not exists: xxx”,看报错路径就能反推实际查找位置
多应用下各模块模板路径隔离,跨应用引入需显式指定路径
当项目含多个应用(如 admin 和 index),各自可独立配置 view_path。此时 {include} 默认只在当前应用的 view_path 内查找,不能自动跨应用引用。
- 例如
admin应用想引入index应用的common/_sidebar.html,不能写{include file="common/_sidebar"}(它只会去admin/view/下找) - 可行方案:在
admin/config/template.php中将view_path设为统一路径(如'view_path' => '../view/'),让两个应用共享视图目录 - 或改用绝对路径写法(需确保路径真实存在):
{include file="/var/www/tp5/application/index/view/common/_sidebar"}—— 但失去跨环境兼容性,不推荐 - 更健壮的做法:把复用模板抽到
application/common/view/,并在各应用config/template.php中用'view_path' => '../common/view/'指向它
最易忽略的一点:模板缓存生效后,修改了 {include} 的目标文件但没清缓存,前端仍显示旧内容。遇到“引入没更新”,第一反应不是路径错,而是删掉 runtime/cache/ 下对应模板的缓存文件(或设 'template.cache' => false 临时关闭缓存)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











