当前位置: 首页 > news >正文

hyperf 十三 视图

教程:Hyperf

composer地址:hyperf/view - Packagist

本次测试使用twig

twig composedr地址:twig/twig - Packagist

twig 文档地址:Home - Twig - The flexible, fast, and secure PHP template engine

一、安装

composer require hyperf/view:v2.2.33
composer require twig/twig

二、配置

创建config/autoload/view.php文件。

php bin/hyperf.php vendor:publish hyperf/view#/config/autoload/view.php
use Hyperf\View\Engine\TwigEngine;
//或者 use App\Engine\TwigEngine;
use Hyperf\View\Mode;
return ['engine' => TwigEngine::class,//视图渲染引擎'mode' => Mode::TASK,//视图渲染模式'config' => ['view_path' => BASE_PATH . '/storage/view/',//视图文件默认地址'cache_path' => BASE_PATH . '/runtime/view/',//视图文件缓存地址],
];

 若task没引入,则引入task。

composer require hyperf/task

Task 模式下,视图渲染工作是在 Task Worker 进程中完成的。task进程和worker进程内存不互通,所以调用 render 时传递数据到视图进行数据的渲染。

若使用 Sync 模式渲染视图时,请确保相关引擎是协程安全的,否则会出现数据混淆的问题,建议使用更加数据安全的 Task 模式。

配置静态资源。

#/config/autoload/server.php
'settings' => [……// Task Worker 数量,根据您的服务器配置而配置适当的数量'task_worker_num' => 2,// 因为 `Task` 主要处理无法协程化的方法,所以这里推荐设为 `false`,避免协程下出现数据混淆的情况'task_enable_coroutine' => false,],

三、实现

#namespace App\Engine\TwigEngine use Hyperf\View\Engine\EngineInterface;
use Hyperf\View\Engine\TwigEngine as EngineTwigEngine;class TwigEngine implements EngineInterface
{public function render($template, $data, $config): string{$engine = new EngineTwigEngine();return $engine->render($template, $data, $config);}
}#App\Controller\TestController
public function test6(RenderInterface $render){return $render->render('test.html', ['name' => 'Hyperf']);}#/strage/view/test.html
hello {{name}}

四、实现原理

实现原理也不难理解。根据hyperf/view模块,由配置文件设定RenderInterface实现类Render,调用Render::render()时,调用Render::getContents()。getContents中根据构造中由config/autoload/view.php设定的engine类设置engine值,并调用对应的render()方法。

#Hyperf\View\ConfigProvider
public function __invoke(): array{return ['dependencies' => [RenderInterface::class => Render::class,],……];}#Hyperf\View\Render
public function __construct(ContainerInterface $container, ConfigInterface $config){$engine = $config->get('view.engine', NoneEngine::class);if (! $container->has($engine)) {throw new EngineNotFindException("{$engine} engine is not found.");}$this->engine = $engine;$this->mode = $config->get('view.mode', Mode::TASK);$this->config = $config->get('view.config', []);$this->container = $container;}public function render(string $template, array $data = []): ResponseInterface{return $this->response()->withAddedHeader('content-type', $this->getContentType())->withBody(new SwooleStream($this->getContents($template, $data)));}public function getContents(string $template, array $data = []): string{try {switch ($this->mode) {case Mode::SYNC:/** @var EngineInterface $engine */$engine = $this->container->get($this->engine);$result = $engine->render($template, $data, $this->config);break;case Mode::TASK:default:$executor = $this->container->get(TaskExecutor::class);$result = $executor->execute(new Task([$this->engine, 'render'], [$template, $data, $this->config]));break;}return $result;} catch (\Throwable $throwable) {throw new RenderException($throwable->getMessage(), $throwable->getCode(), $throwable);}}#Hyperf\View\Engine\TwigEngine 
use Twig\Environment;
use Twig\Loader\FilesystemLoader;class TwigEngine implements EngineInterface
{public function render($template, $data, $config): string{$loader = new FilesystemLoader($config['view_path']);$twig = new Environment($loader, ['cache' => $config['cache_path']]);return $twig->render($template, $data);}
}    

http://www.lryc.cn/news/142244.html

相关文章:

  • 请你说说前端图形图像的框架
  • C++数据结构学习——栈
  • 【C++笔记】C++之类与对象(下)
  • 管理类联考——英语——实战篇——大作文——图表——动态图表——整体效果
  • threejs纹理加载三(视频加载)
  • VUE笔记(三)vue的语法
  • 探讨uniapp的路由与页面生命周期问题
  • 咸鱼之王俱乐部网站开发
  • Electron+Vue3+TS 打包exe客户端
  • vue3范围选择组件封装
  • 能被整除的数(容斥原理)
  • Modbus转Profinet网关与流量变送器兼容转ModbusTCP协议博图配置
  • HLS实现CORDIC算法计算正余弦并上板验证
  • 高阶数据结构并查集
  • WSL2连接不了外网怎么办?
  • 【C/C++】探索内存对齐的奥秘与优势
  • leetcode分类刷题:滑动窗口(二、重复元素类型)
  • MySQL—buffer pool
  • 《C和指针》笔记8: 枚举类型
  • Python爬虫框架之Selenium库入门:用Python实现网页自动化测试详解
  • docker swarm 部署服务网络问题
  • 1.00001git源码clone后进行编译(带调试)
  • 使用StorageClass动态创建pv
  • 数据结构(Java实现)-ArrayList与顺序表
  • 性能优化维度
  • PMP P-06 Resource Management
  • 【C++】map的奇葩用法:和函数结合
  • 关于JVM的参数类型
  • HTTP协议中的Content-Type及其常见类型
  • android Junit4编写自测用例