ThinkPHP 7.0 默认使用 think-template 引擎,需确认 config/template.php 中 'type' => 'Think' 且命令行验证输出为 "Think";模板路径为 view/模块/控制器/操作.html,fetch() 不带后缀;变量用 assign() 或 fetch() 传参,键名禁用点号;{include} 参数用 [param] 替换;自定义标签需注册 taglib 并清空 runtime/view 缓存。

你需要快速上手 ThinkPHP 7.0 的模板引擎与视图管理,但官方手册分散、版本混杂、配置项含义模糊,直接照搬容易报错或变量不渲染——比如 fetch() 调用后页面空白、{$name} 不输出、{include} 找不到文件、自定义标签失效,这些问题都源于没理清模板路径、驱动加载顺序和变量传递链路。
确认当前模板引擎类型并验证是否启用
打开 config/template.php 文件,检查 【'type' => 'Think'】 这一行是否生效。ThinkPHP 7.0 默认使用内置的 think-template 引擎,不是原生 PHP 或 Twig;若此处写成 'type' => 'Php' 或留空,视图将无法解析 {volist} 等标签,只当纯 HTML 渲染。
执行命令行验证:进入项目根目录,运行 php -r "var_dump(config('template.type'));",输出必须是字符串 "Think",否则后续所有模板语法均无效。
注意:不要在控制器里临时改 config —— 视图驱动在 App 初始化阶段已锁定,运行时修改无效。
立即学习“PHP免费学习笔记(深入)”;
模板文件存放路径与自动匹配规则
ThinkPHP 7.0 按模块/控制器/操作三级结构自动定位模板,路径格式为:view/模块名/控制器名/操作名.html(模块名默认为 index)。
例如控制器 app\controller\User.php 中的 read() 方法,默认加载 view/user/read.html;若启用了多应用模式且当前是 admin 应用,则路径变为 view/admin/user/read.html。
手动指定路径时,fetch('user/profile') 表示加载 view/user/profile.html,【不能带 .html 后缀,也不能写相对路径如 ./user/profile】,否则报错 Template not found。
如果模板不在标准路径下,需在 config/template.php 中显式设置 'view_path' => app_path('view/') . DS,确保与实际目录一致。
变量赋值与模板输出的两种方式
方法一:全局 assign(推荐用于跨方法复用)
在控制器中调用 $this->assign('title', '用户列表')->assign('list', $users);,然后 return $this->fetch(); 即可渲染,模板内直接写 {$title}、{volist name="list" id="user"}{$user.name}{/volist}。
方法二:单次 fetch 传参(适合局部覆盖)return $this->fetch('index', ['title' => '首页', 'banner' => $data]);,此时模板中 {$title} 取值优先级高于 $this->assign() 已设的同名变量,【会完全覆盖,不是合并】。
注意:数组键名不能含点号或中划线,如 assign('user.info', $arr) 在模板中无法用 {$user.info} 访问,必须改为 assign('user_info', $arr) 再用 {$user_info}。
公共模板包含与参数传递
第一步:在 view/public/header.html 中写内容,例如:<title>[title]</title>
<meta name="keywords" content="[keywords]">。
第二步:在业务模板中写 {include file="public/header" title="后台管理系统" keywords="用户管理,权限控制"}。
第三步:确保 public 是相对于 view/ 的子目录,不是网站根目录或 public/ 静态资源目录。
include 标签不支持嵌套路径别名(如 blue:header),ThinkPHP 7.0 已移除主题前缀机制;若需多主题,必须手动拼接路径,例如 {include file="theme_blue/public/header"} 并确保该文件真实存在。
传入的参数在被包含模板中用 [参数名] 替换,不是 {$参数名},也不是 {?参数名},写错就原样输出方括号。
自定义标签注册与调试流程
① 创建标签库类,例如 app\taglib\MyTag.php,继承 \think\template\TagLib,命名空间正确,类名与文件名严格一致。
② 在类中定义解析方法,如 public function parseHello($attrs) { return '<?php echo "Hello ". $attrs["name"];?>'; },方法名必须是 parseXxx 格式,对应标签 {my:hello name="world"}。
③ 在 app/common.php 中注册:\think\Template::extend('my', 'app\taglib\MyTag');,这一步必须在框架初始化完成前执行,不能放在控制器里。
④ 修改 config/template.php 的 'taglib' => ['my'],让引擎识别该前缀。
⑤ 清空 runtime/view/ 目录,否则旧缓存仍按无标签逻辑编译,新标签永远不生效。
调试时不要依赖 dump() 查看标签是否注册成功——它只显示运行时变量,不反映编译期行为;真正有效的是打开 runtime/view/ 下最新生成的 PHP 缓存文件,搜索 echo "Hello" 是否出现。



















