- 后端
- 微服务
【免费下载链接】hyperf
🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.
Hyperf 框架的视图组件hyperf/view为服务端页面渲染提供了统一抽象,默认支持Blade、Smarty、Twig、Plates、ThinkTemplate五种主流 PHP 模板引擎,并允许通过实现EngineInterface接入任意自定义模板引擎。本文以官方文档为主线,结合仓库源码与测试用例,完整讲解组件的安装、配置、Task/Sync 两种渲染模式、静态资源托管、引擎选型与自定义接入方案,帮助你在微服务或中间件项目中快速落地服务端渲染能力。
组件概览
视图组件由hyperf/view实现并提供使用。它本身只负责「调度」,真正的模板解析由你选择的引擎完成——因此默认安装hyperf/view时不会附带任何模板引擎,使用前必须至少安装一种。仓库中该组件的核心代码位于 src/view,包括:
- 渲染调度核心 Render.php 与接口 RenderInterface.php;
- 渲染模式常量 Mode.php(
task与sync); - 六种引擎实现目录 src/view/src/Engine,其中
NoneEngine是未配置引擎时的占位实现; - 服务提供者 ConfigProvider.php,负责注册
RenderInterface依赖与发布配置文件。
安装
composer require hyperf/view安装完成后,按需安装至少一种模板引擎(见下文「视图渲染引擎」一节),组件即可投入使用。
配置
View 组件的配置文件位于config/autoload/view.php。若该文件不存在,可执行如下命令生成:
php bin/hyperf.php vendor:publish hyperf/view该命令由 ConfigProvider.php 中的publish配置驱动,将仓库内的 publish/view.php 发布到应用根目录的config/autoload/view.php。
配置项说明如下:
| 配置 | 类型 | 默认值 | 备注 |
|---|---|---|---|
| engine | string | Hyperf\View\Engine\BladeEngine::class | 视图渲染引擎 |
| mode | string | Mode::TASK | 视图渲染模式 |
| config.view_path | string | 无 | 视图文件默认地址 |
| config.cache_path | string | 无 | 视图文件缓存地址 |
配置文件格式示例:
<?php declare(strict_types=1); use Hyperf\View\Mode; use Hyperf\View\Engine\BladeEngine; return [ // 使用的渲染引擎 'engine' => BladeEngine::class, // 不填写则默认为 Task 模式,推荐使用 Task 模式 'mode' => Mode::TASK, 'config' => [ // 若下列文件夹不存在请自行创建 'view_path' => BASE_PATH . '/storage/view/', 'cache_path' => BASE_PATH . '/runtime/view/', ], ];有一点值得注意:上表与示例中的「默认值」是组件代码层面的回退值(见 Render.php:engine未配置时回退到NoneEngine::class,mode未配置时回退到Mode::TASK);而仓库实际发布的配置文件 publish/view.php 默认给出的则是NoneEngine::class与Mode::SYNC——也就是说,直接vendor:publish得到的配置默认不会渲染任何内容、且采用 Sync 模式。因此建议在实际项目中按上表显式指定engine与mode,避免使用未配置引擎的NoneEngine占位实现。
Task 模式
使用Task模式时,需引入hyperf/task组件,且必须配置task_enable_coroutine为false,否则会出现协程数据混淆的问题,更多细节请查阅 Task 组件文档。
在Task模式下,视图渲染工作是在Task Worker进程中完成的,而请求处理(即 Controller)是在Worker进程完成的,两部分工作由不同进程完成,所以像Request、Session等在Worker进程通过上下文管理的对象或数据,在视图页面上无法直接使用。此时需要你在 Controller 中先处理好数据或判断结果,再在调用render时把数据传递给视图进行渲染。
从源码看,Task 模式的调度逻辑位于 Render.php:组件从容器中取出TaskExecutor,以[$this->engine, 'render']为回调、以[$template, $data, $this->config]为参数投递一个Task,由 Task Worker 进程完成实际渲染后再将结果字符串返回给 Worker 进程。
Sync 模式
若使用Sync模式渲染视图,请确保所选引擎是协程安全的,否则同样会出现数据混淆的问题。源码中 Render.php 在 Sync 模式下直接从容器获取引擎实例并同步调用其render方法。由于 Hyperf 基于 Swoole 常驻内存,非协程安全的引擎实例会被多个协程复用,因此官方建议使用数据更安全的Task模式。仓库测试 RenderTest.php 对TASK与SYNC两种模式均做了渲染结果与content-type的断言,两种模式输出一致,可按需切换。
配置静态资源
如果你希望Swoole来管理静态资源,请在config/autoload/server.php配置中增加以下配置:
return [ 'settings' => [ ... // 静态资源 'document_root' => BASE_PATH . '/public', 'enable_static_handler' => true, ], ];配置后,public目录下的 CSS、JS、图片等静态文件即可由 Swoole 的 HTTP 服务直接响应,无需经过 PHP 应用层。
视图渲染引擎
官方目前支持Blade、Smarty、Twig、Plates和ThinkTemplate五种模板引擎。如前所述,安装hyperf/view不会自动安装任何模板引擎,需要根据自身需求自行安装对应引擎,使用前必须安装任一引擎。
安装 Blade 引擎
composer require hyperf/view-engine详细方式见文档 视图引擎。
或者使用duncan3dc/blade:
composer require duncan3dc/blade注意:
duncan3dc/blade因为使用了 Laravel 的 Support 库,会导致某些函数不兼容,暂时不推荐使用。
仓库中 BladeEngine.php 的默认实现正是基于duncan3dc\Laravel\BladeInstance构建,以view_path作为模板目录、cache_path作为编译缓存目录。若需要完整的 Laravel Blade 语法(如@extends、@include、组件等)与更好的兼容性,建议通过hyperf/view-engine组件获得官方维护的 Blade 编译实现。
安装 Smarty 引擎
composer require smarty/smartySmartyEngine.php 的实现会创建新的Smarty实例,将view_path设为模板目录、cache_path同时作为缓存与编译目录,并将渲染数据逐项assign后fetch模板。
安装 Twig 引擎
composer require twig/twigTwigEngine.php 基于FilesystemLoader加载view_path目录,并将cache_path作为 Twig 的编译缓存目录。该引擎还额外支持一个配置项:config.template_suffix,若配置了后缀(例如.twig),会自动追加到模板名后,便于省略后缀调用。
安装 Plates 引擎
composer require league/platesPlatesEngine.php 实例化League\Plates\Engine时使用config.file_extension(未配置时默认php)作为模板文件扩展名,这意味着 Plates 模板默认就是「带 PHP 语法的原生模板」文件。
安装 ThinkTemplate 引擎
composer require sy-records/think-templateThinkEngine.php 将整个view.config数组直接传给think\Template构造器(其中自然包含view_path等路径信息),随后assign渲染数据并fetch模板,与 ThinkPHP 系的模板语法保持一致的体验。
接入其他模板
假设我们要接入一个虚拟的模板引擎TemplateEngine,只需在任意位置创建对应类并实现Hyperf\View\Engine\EngineInterface接口即可。接口定义非常精简(见 EngineInterface.php),只包含一个render(string $template, array $data, array $config): string方法:
<?php declare(strict_types=1); namespace App\Engine; use Hyperf\View\Engine\EngineInterface; class TemplateEngine implements EngineInterface { public function render($template, $data, $config): string { // 实例化对应的模板引擎的实例 $engine = new TemplateInstance(); // 并调用对应的渲染方法 return $engine->render($template, $data); } }然后修改视图组件的配置,将engine指向自定义类:
<?php use App\Engine\TemplateEngine; return [ // 将 engine 参数改为您的自定义模板引擎类 'engine' => TemplateEngine::class, 'mode' => Mode::TASK, 'config' => [ 'view_path' => BASE_PATH . '/storage/view/', 'cache_path' => BASE_PATH . '/runtime/view/', ], ];自定义引擎接入后即与官方引擎走完全相同的调度链路:无论是 Sync 模式的容器直取,还是 Task 模式的TaskExecutor投递,最终调用的都是EngineInterface::render。
使用
以下以BladeEngine为例。首先在配置的view_path目录(即storage/view/)里创建视图文件index.blade.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hyperf</title> </head> <body> Hello, {{ $name }}. You are using blade template now. </body> </html>在控制器中获取Hyperf\View\RenderInterface实例,调用render方法并传递视图文件地址index与渲染数据即可。文件地址忽略视图文件的后缀名(.blade.php):
<?php declare(strict_types=1); namespace App\Controller; use Hyperf\HttpServer\Annotation\AutoController; use Hyperf\View\RenderInterface; #[AutoController] class ViewController { public function index(RenderInterface $render) { return $render->render('index', ['name' => 'Hyperf']); } }访问对应的 URL,即可获得如下所示的视图页面:
Hello, Hyperf. You are using blade template now.得益于 ConfigProvider.php 中的依赖绑定(RenderInterface::class => Render::class),你在控制器中直接以构造注入或方法注入RenderInterface即可拿到渲染实例,无需手动装配。
源码级渲染流程
Render类是整个组件的调度中枢,其工作流程可以概括为三步(见 Render.php):
- 构造阶段(L36-L46):从配置中心读取
view.engine、view.mode、view.config三个配置;若配置的引擎类不存在于容器中,抛出EngineNotFindException。 - 渲染阶段(L55-L75):
getContents根据mode分流——Sync 模式从容器取出引擎直接调用;Task 模式构造Task交给TaskExecutor在 Task Worker 中执行;任何渲染异常都会包装为RenderException抛出(仓库测试 RenderTest.php 专门验证了模板缺失时抛出RenderException且保留原始异常链)。 - 响应阶段(L48-L53 与 L77-L82):
render通过ResponseContext取得当前协程响应对象,写入content-type: text/html(若配置了view.config.charset,会自动拼接为; charset=xxx),再以SwooleStream将渲染结果字符串写入响应体,最终返回 PSR-7 风格的ResponseInterface。
这也解释了为何使用render时无需手动return响应:它直接向当前上下文响应对象写入了 body,并返回该响应对象供框架发送。
实践建议
- 模式选择:默认推荐
Task模式,以规避模板引擎在协程环境下可能产生的数据混淆;使用该模式务必引入hyperf/task并将task_enable_coroutine设为false。 - 引擎选型:追求 Laravel 生态语法选
hyperf/view-engine的 Blade;追求轻量原生模板可选 Plates;已有 ThinkPHP 经验可选 ThinkTemplate;Smarty、Twig 则适合熟悉对应语法的团队。 - 目录约定:视图文件统一放在
storage/view/(可用BASE_PATH . '/storage/view/'定位),编译缓存统一放在runtime/view/,发布配置时若目录不存在请自行创建。 - 数据传递:牢记 Task 模式下渲染发生在 Task Worker 进程,
Request、Session等上下文数据无法在模板中直接访问,务必在 Controller 层完成数据准备后再传入render。 - 静态资源:需要 Swoole 直接托管 JS/CSS/图片时,在
config/autoload/server.php的settings中开启document_root与enable_static_handler。
至此,你已掌握 Hyperf 视图组件的完整使用路径:安装组件与引擎 → 发布并配置view.php→ 选择 Task/Sync 模式 → 创建模板并在控制器注入RenderInterface渲染 → 按需通过EngineInterface接入私有模板方案。仓库中的 src/view 目录与 RenderTest.php 测试用例可作为继续深入阅读的最佳起点。
- 后端
- 微服务
【免费下载链接】hyperf
🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.
相关推荐
Hyperf 视图组件实战指南:五大模板引擎接入、Task/Sync 渲染模式与自定义引擎扩展
Hyperf 视图组件实战指南:五大模板引擎接入、Task/Sync 渲染模式与自定义引擎扩展 Hyperf 框架的视图组件( hyperf/view )为 H
后端Web框架微服务RPC框架异步编程Hyperf View 渲染实战指南:View 组件配置、Task/Sync 渲染模式与五大模板引擎接入
Hyperf View 渲染实战指南:View 组件配置、Task/Sync 渲染模式与五大模板引擎接入 Hyperf 的 hyperf/view 组件为基于
后端微服务Hyperf View 视图渲染组件完全指南:五大模板引擎、Task/Sync 双模式与自定义引擎扩展
Hyperf View 视图渲染组件完全指南:五大模板引擎、Task/Sync 双模式与自定义引擎扩展 本指南以 Hyperf 官方文档中 View 组件的完整
后端Web框架微服务RPC框架异步编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考