hyperf 十三 视图

这篇具有很好参考价值的文章主要介绍了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()方法。文章来源地址https://www.toymoban.com/news/detail-672132.html

#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);
    }
}    

到了这里,关于hyperf 十三 视图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hyperf 十四 国际化

    官方网址:Hyperf 文件结构:         /storage/languages/en/messages.php         /storage/languages/zh_CH/messages.php 创建文件 /config/autoload/translation.php。 多语言的调用从注入开始,即HyperfTranslationTranslator::__construct(TranslatorLoaderInterface $loader, string $locale)方法。根据配置文件Translato

    2024年02月11日
    浏览(58)
  • hyperf 十、分页

    教程:Hyperf 我用的hyperf2需要自己安装 执行的时候会调用rm删除文件 window调用会有问题,但是也有解决办法。 先删除 runtime/container,再改composer.json 根据代码可以增加参数,比如path。  nextPageUrl         获取下一页路径 render        使用给定视图呈现分页器 hasMorePages

    2024年02月16日
    浏览(22)
  • hyperf协程

            我们已经知道了协程可以很好的解决异步非阻塞系统的开发问题,那么协程本身到底是什么呢?从定义上来说, 协程是一种轻量级的线程,由用户代码来调度和管理,而不是由操作系统内核来进行调度,也就是在用户态进行 。可以直接的理解为就是一个非标准的

    2024年02月15日
    浏览(25)
  • hyperf 学习 三、中间件

    文档地址:Hyperf 中间件的原理就是请求时拦截并进行处理,再传到对应的回调,处理返回数据。 流程:request- middleware-response。 中间件在路由定义时配置。所以根据上一篇文章hyperf 学习 二、路由_lsswear的博客-CSDN博客 中注释路由 Controller、AutoController可以配置 options。 后来查

    2024年02月12日
    浏览(46)
  • Hyperf使用RabbitMQ消息队列

    Hyperf连接使用RabbitMQ消息中间件 使用Docker部署RabbitMQ,-传送门 使用Docker部署Hyperf,-传送门- 安装amqp扩展 安装command命令行扩展 配置参数 假设已经在rabbitmq设置了交换机exchange_test和队列queue_test 新建 /config/autoload/amp.php配置文件,修改地址和用户名密码 创建生产者中间件 exch

    2024年02月13日
    浏览(45)
  • Hyperf 运行各种网络服务

    简单地运行起普通的 HTTP 服务之后,今天我们再来学习一下如何使用 Hyperf 运行 TCP/UDP 以及 WebSocket 服务。 之前我们通过普通的 Swoole 都已经搭建起过这些服务,其实和 HTTP 服务都差不多,只是修改一些参数或者监听的事件而已。在框架中,实现这些服务也是类似的,而且会更

    2024年02月03日
    浏览(27)
  • hyperf 其他组件 一 Task

    教程:Hyperf 为防止有些函数导致堵塞进程,使用task模拟携程处理。本质上是多进程运行阻塞函数,性能取决于Task Worker数量。 这块的实现我没看懂。 Task不是默认配置,须在server.php中加Task配置。  其他地方也没找到task对应的方法实现……  最后这种是错误使用,应该没关联

    2024年02月13日
    浏览(14)
  • hyperf 二十二 数据库 模型关系

    教程:Hyperf 通过设置 HyperfDatabaseModelBuilder::eagerLoad加载需查询用的model, 查询条件子查询使用in。 eagerLoad在Builder::eagerLoadRelations()被调用,传入Builder::eagerLoadRelation()。eagerLoadRelation()中调用addEagerConstraints()构造查询。  用户和图片一对多关系,文章和图片一对一关系。  一

    2024年01月19日
    浏览(44)
  • hyperf 二十一 数据库 模型关系

    教程:Hyperf 根据文档 一对一:Model::hasOne(被关联模型,被关联模型外键,本模型被关联的字段) 一对多:Model::hasMany(被关联模型,被关联模型外键,本模型被关联的字段) 反向一对多:Model::belongsTo(被关联模型,本模型外键,被关联模型的对应字段,关联关系) 多对多:Model:

    2024年01月17日
    浏览(47)
  • docker 安装rabbitmq并配置hyperf使用

    这里我想完成的是 制作消息(多个协程制造)——》推送到rabbitmq——》订阅消息队列——》消费消息(ws协程客户端【一次消费多条】/ws前端) 利用 WebSocket 协议让客户端和服务器端保持有状态的长链接,保存链接上来的客户端 id。订阅发布者发布的消息针对已保存的客户

    2024年03月12日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包