Hyperf作为一款高性能的PHP协程框架,内置了基于think_template的模板引擎来实现视图渲染功能,开发者可以通过简单的配置和调用完成页面内容的输出。视图渲染能够将后端处理的数据和前端模板结合,生成最终的HTML页面返回给客户端。
Hyperf视图组件安装与配置
首先需要通过Composer安装Hyperf的视图组件,执行以下命令完成安装:
composer require hyperf/view
安装完成后需要在配置文件config/autoload/view.php中配置视图相关参数,默认的配置文件内容如下:
<?php
return [
// 视图引擎,默认使用think_template
'engine' => HyperfViewEngineThinkEngine::class,
// 视图文件存放目录
'view_path' => BASE_PATH . '/storage/views/',
// 视图缓存目录,模板编译后的文件会存放在这里
'cache_path' => BASE_PATH . '/runtime/view/',
// 模板后缀,默认是html
'suffix' => '.html',
];
如果没有该配置文件,可以手动创建,确保视图路径和缓存路径的目录存在且有写入权限。
控制器中渲染视图的两种方式
使用视图函数渲染
Hyperf提供了全局的view函数,可以在控制器中直接调用,传入模板路径和参数数组即可完成渲染:
<?php
declare(strict_types=1);
namespace AppController;
use HyperfHttpServerContractResponseInterface;
use HyperfContextApplicationContext;
class IndexController
{
public function index()
{
// 获取响应对象
$response = ApplicationContext::getContainer()->get(ResponseInterface::class);
// 渲染index模板,传递name和age两个变量
$html = view('index', [
'name' => '张三',
'age' => 20
]);
return $response->html($html);
}
}
使用View组件渲染
也可以通过注入View组件的方式完成渲染,代码如下:
<?php
declare(strict_types=1);
namespace AppController;
use HyperfViewRenderInterface;
class IndexController
{
public function index(RenderInterface $view)
{
// 直接调用render方法,返回渲染后的HTML内容
return $view->render('index', [
'name' => '李四',
'age' => 22
]);
}
}
模板文件编写规则
按照配置中的view_path路径,模板文件需要存放在storage/views/目录下,上面的示例中调用的index模板对应文件为storage/views/index.html,模板内容可以使用think_template的语法:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>用户信息</title>
</head>
<body>
<h1>用户基本信息</h1>
<p>姓名:{$name}</p>
<p>年龄:{$age}</p>
</body>
</html>
模板引擎常用语法
变量输出与赋值
除了直接输出控制器传递的变量,模板中也支持临时赋值:
{/* 输出变量 */}
<p>用户名:{$username}</p>
{/* 模板中临时赋值 */}
{assign name="score" value="90"/}
<p>分数:{$score}</p>
{/* 输出数组元素 */}
<p>用户邮箱:{$user['email']}</p>
<p>用户手机号:{$user.mobile}</p>
条件判断
模板中支持if、switch等条件判断语法:
{if $age >= 18}
<p>该用户已成年</p>
{elseif $age >= 12}
<p>该用户为青少年</p>
{else}
<p>该用户为儿童</p>
{/if}
{switch $status}
{case 1}
<p>订单状态:待支付</p>
{case 2}
<p>订单状态:已支付</p>
{default}
<p>订单状态:未知</p>
{/switch}
循环语法
常用的循环有volist、foreach等,适合输出数组数据:
{/* volist循环,name是控制器传递的数组变量名,id是当前元素别名 */}
<ul>
{volist name="user_list" id="item"}
<li>用户ID:{$item.id},用户名:{$item.name}</li>
{/volist}
</ul>
{/* foreach循环 */}
{foreach $article_list as $article}
<div>
<h3>{$article.title}</h3>
<p>{$article.content}</p>
</div>
{/foreach}
模板继承
可以将公共的页面布局抽成父模板,子模板继承父模板后只需要填充差异内容,父模板base.html示例:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{block name="title"}默认标题{/block}</title>
</head>
<body>
<header>公共头部内容</header>
{block name="content"}默认内容区域{/block}
<footer>公共底部内容</footer>
</body>
</html>
子模板child.html继承父模板的写法:
{extend name="base" /}
{block name="title"}子页面标题{/block}
{block name="content"}
<p>这是子页面独有的内容</p>
<p>当前时间:{$current_time}</p>
{/block}
常见问题说明
- 如果渲染时报模板文件不存在,先检查模板路径是否和配置中的
view_path一致,模板文件名是否正确,不需要写后缀。 - 模板修改后没有生效,可能是缓存导致的,可以删除
runtime/view/目录下的缓存文件后重新访问。 - 如果需要在模板中使用PHP函数,可以通过
{$variable|function_name}的方式调用,比如{$time|date='Y-m-d H:i:s'}。
Hyperf视图渲染模板引擎think_template修改时间:2026-06-22 16:46:09