学习路之PHP--easyswoole使用视图和模板

news2025/7/23 13:09:54

学习路之PHP--easyswoole使用视图和模板

  • 一、安装依赖插件
  • 二、 实现渲染引擎
  • 三、注册渲染引擎
  • 四、测试调用写的模板
  • 五、优化
  • 六、最后补充

一、安装依赖插件

composer require easyswoole/template:1.1.*
composer require topthink/think-template

相关版本:

        "easyswoole/easyswoole": "3.3.x",
        "easyswoole/orm": "^1.5",
        "easyswoole/template": "1.1.*",
        "topthink/think-template": "^2.0"

二、 实现渲染引擎

在 App 目录下 新建 System 目录 存放 渲染引擎实现的代码 ThinkTemplate.php

<?php
namespace App\System;
 
use EasySwoole\Template\RenderInterface;
use think\facade\Template;
 
class ThinkTemplate implements RenderInterface
{
    // tp模板类对象
    private $_topThinkTemplate;
 
    public function __construct()
    {
        $temp_dir = sys_get_temp_dir();
        $config = [
            'view_path' => EASYSWOOLE_ROOT . '/App/HttpTemplate/', // 模板存放文件夹根目录
            'cache_path' => $temp_dir, // 模板文件缓存目录
            'view_suffix' => 'html' // 模板文件后缀
        ];
        $this->_topThinkTemplate = new \think\Template($config);
    }
 
    public function afterRender(?string $result, string $template, array $data = [], array $options = [])
    {
    }
    // 当模板解析出现异常时调用
    public function onException(\Throwable $throwable): string
    {
        $msg = $throwable->getMessage() . " is file " . $throwable->getFile() . ' of line' . $throwable->getLine();
        return $msg;
    }
    // 渲染逻辑实现
    public function render(string $template, array $data = [], array $options = []): ?string
    {
        foreach ($data as $k => $v) {
            $this->_topThinkTemplate->assign([$k => $v]);
        }
        // Tp 模板渲染函数都是直接输出 需要打开缓冲区将输出写入变量中 然后渲染的结果
        ob_start();
        $this->_topThinkTemplate->fetch($template);
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
    }
}

由于版本问题:报错
在这里插入图片描述

<?php
namespace App\System;
 
use EasySwoole\Template\RenderInterface;
use think\facade\Template;
 
class ThinkTemplate implements RenderInterface
{
    // tp模板类对象
    private $_topThinkTemplate;
 
    public function __construct()
    {
        $temp_dir = sys_get_temp_dir();
        $config = [
            'view_path' => EASYSWOOLE_ROOT . '/App/HttpTemplate/', // 模板存放文件夹根目录
            'cache_path' => $temp_dir, // 模板文件缓存目录
            'view_suffix' => 'html' // 模板文件后缀
        ];
        $this->_topThinkTemplate = new \think\Template($config);
    }
 
    public function afterRender(?string $result, string $template, array $data = [], array $options = [])
    {
    }
    // 当模板解析出现异常时调用
    // public function onException(\Throwable $throwable): string
    // {
    //     $msg = $throwable->getMessage() . " is file " . $throwable->getFile() . ' of line' . $throwable->getLine();
    //     return $msg;
    // }
    // 渲染逻辑实现
    // public function render(string $template, array $data = [], array $options = []): ?string
    // {
    //     foreach ($data as $k => $v) {
    //         $this->_topThinkTemplate->assign([$k => $v]);
    //     }
    //     // Tp 模板渲染函数都是直接输出 需要打开缓冲区将输出写入变量中 然后渲染的结果
    //     ob_start();
    //     $this->_topThinkTemplate->fetch($template);
    //     $content = ob_get_contents();
    //     ob_end_clean();
    //     return $content;
    // }
    
    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        // return "your template is {$template} and data is " . json_encode($data);
          foreach ($data as $k => $v) {
            $this->_topThinkTemplate->assign([$k => $v]);
        }
        // Tp 模板渲染函数都是直接输出 需要打开缓冲区将输出写入变量中 然后渲染的结果
        ob_start();
        $this->_topThinkTemplate->fetch($template);
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
    }
    
    public function onException(\Throwable $throwable, $arg): string
    {
        // return $throwable->getTraceAsString();
        $msg = $throwable->getMessage() . " is file " . $throwable->getFile() . ' of line' . $throwable->getLine();
        return $msg;
    }
}

三、注册渲染引擎

需要对模板引擎进行实例化并且注入到EasySwoole 的视图中 在项目根目录 EasySwooleEvent.php 中 mainServerCreate 事件函数中进行注入代码如下

use App\System\ThinkTemplate;
use EasySwoole\Template\Render; use
EasySwoole\Template\RenderInterface;

// 设置Http服务模板类
Render::getInstance()->getConfig()->setRender(new ThinkTemplate());
Render::getInstance()->getConfig()->setTempDir(EASYSWOOLE_TEMP_DIR);
Render::getInstance()->attachServer(ServerManager::getInstance()->getSwooleServer());

四、测试调用写的模板

在App目录下创建 HttpTemplate 目录 PS:之前在 ThinkTemplate.php 文件中设置的路径

创建文件 /App/HttpTemplate/Admin/Index/index.html 路径与模块 控制器 响应函数相对应 你也可以按照自己的喜欢来

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tao</title>
</head>
<body>
<ul>
    {foreach $user_list as $key => $val}
    <li>{$key} => {$val}</li>
    {/foreach}
</ul>
</body>
</html>

在 App\HttpController\Admin 中调用

use EasySwoole\Template\Render;
public function index()
    {
         $user_list = [
            '1', '2', '3', '4', '5'
        ];
        $this->response()->write(Render::getInstance()->render('Index/index', ['user_list' => $user_list]));
    }

在这里插入图片描述
在这里插入图片描述

五、优化

这样的模板传值非常麻烦有木有 还必须要放在一个数组中一次性传给 Render 对象 我们可以将操作封装到基类控制器 实现类似于TP框架的操作 代码如下

<?php
/**
 * 基础控制器类
 */
namespace App\HttpController;
 
use EasySwoole\Template\Render;
 
abstract class Controller extends \EasySwoole\Http\AbstractInterface\Controller
{
    public $template_data = [];

    public function assign($name, $value) {
        $this->template_data[$name] = $value;
    }
 
    public function fetch($template_name) {
        return Render::getInstance()->render($template_name, $this->template_data);
    }
}

这样我们就可以使用TP的风格进行模板传值了 效果和上面时一样的 PS:暂时需要指定模板的路径

function index()
    {
        $user_list = [
            '1', '2', '3', '4', '5'
        ];
        $this->assign('user_list', $user_list);
        $this->response()->write($this->fetch('Index/index'));
    }

六、最后补充

EasySwooleEvent.php

<?php
namespace EasySwoole\EasySwoole;


use EasySwoole\EasySwoole\Swoole\EventRegister;
use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\Http\Request;
use EasySwoole\Http\Response;
use App\Process\HotReload;
use EasySwoole\ORM\DbManager;
use EasySwoole\ORM\Db\Connection;
use App\System\ThinkTemplate;
use EasySwoole\Template\Render;
use EasySwoole\Template\RenderInterface;

class EasySwooleEvent implements Event
{

    public static function initialize()
    {
        // TODO: Implement initialize() method.
        date_default_timezone_set('Asia/Shanghai');

        $config = new \EasySwoole\ORM\Db\Config(Config::getInstance()->getConf('MYSQL'));
        DbManager::getInstance()->addConnection(new Connection($config));
    }

    public static function mainServerCreate(EventRegister $register)
    {
        // TODO: Implement mainServerCreate() method.
        $swooleServer = ServerManager::getInstance()->getSwooleServer();
        $swooleServer->addProcess((new HotReload('HotReload', ['disableInotify' => false]))->getProcess());
        
        
        Render::getInstance()->getConfig()->setRender(new ThinkTemplate());
        Render::getInstance()->getConfig()->setTempDir(EASYSWOOLE_TEMP_DIR);
        Render::getInstance()->attachServer(ServerManager::getInstance()->getSwooleServer());
    }

    public static function onRequest(Request $request, Response $response): bool
    {
        // TODO: Implement onRequest() method.
        return true;
    }

    public static function afterRequest(Request $request, Response $response): void
    {
        // TODO: Implement afterAction() method.
    }
}

App\System\ThinkTemplate.php

<?php
namespace App\System;
 
use EasySwoole\Template\RenderInterface;
use think\facade\Template;
 
class ThinkTemplate implements RenderInterface
{
    // tp模板类对象
    private $_topThinkTemplate;
 
    public function __construct()
    {
        $temp_dir = sys_get_temp_dir();
        $config = [
            'view_path' => EASYSWOOLE_ROOT . '/App/HttpTemplate/', // 模板存放文件夹根目录
            'cache_path' => $temp_dir, // 模板文件缓存目录
            'view_suffix' => 'html' // 模板文件后缀
        ];
        $this->_topThinkTemplate = new \think\Template($config);
    }
 
    public function afterRender(?string $result, string $template, array $data = [], array $options = [])
    {
    }
    // 当模板解析出现异常时调用
    // public function onException(\Throwable $throwable): string
    // {
    //     $msg = $throwable->getMessage() . " is file " . $throwable->getFile() . ' of line' . $throwable->getLine();
    //     return $msg;
    // }
    // 渲染逻辑实现
    // public function render(string $template, array $data = [], array $options = []): ?string
    // {
    //     foreach ($data as $k => $v) {
    //         $this->_topThinkTemplate->assign([$k => $v]);
    //     }
    //     // Tp 模板渲染函数都是直接输出 需要打开缓冲区将输出写入变量中 然后渲染的结果
    //     ob_start();
    //     $this->_topThinkTemplate->fetch($template);
    //     $content = ob_get_contents();
    //     ob_end_clean();
    //     return $content;
    // }
    
    public function render(string $template, ?array $data = null, ?array $options = null): ?string
    {
        // return "your template is {$template} and data is " . json_encode($data);
          foreach ($data as $k => $v) {
            $this->_topThinkTemplate->assign([$k => $v]);
        }
        // Tp 模板渲染函数都是直接输出 需要打开缓冲区将输出写入变量中 然后渲染的结果
        ob_start();
        $this->_topThinkTemplate->fetch($template);
        $content = ob_get_contents();
        ob_end_clean();
        return $content;
    }
    
    public function onException(\Throwable $throwable, $arg): string
    {
        // return $throwable->getTraceAsString();
        $msg = $throwable->getMessage() . " is file " . $throwable->getFile() . ' of line' . $throwable->getLine();
        return $msg;
    }
}

App\HttpController\Index.php

<?php


namespace App\HttpController;



use EasySwoole\Template\Render;

class Index extends BaseController
{
    /**
     * 
     */
    public function index()
    {
      
        $user_list = [
            '1', '2', '3', '4', '5'
        ];
        $this->assign('user_list', $user_list);
        $this->response()->write($this->fetch('Index/index'));
    }


}

App\HttpController\BaseController.php

<?php
/**
 * 基础控制器类
 */
namespace App\HttpController;
 
use EasySwoole\Template\Render;

abstract class BaseController extends \EasySwoole\Http\AbstractInterface\Controller
{
    public $template_data = [];

    public function assign($name, $value) {
        $this->template_data[$name] = $value;
    }
 
    public function fetch($template_name) {
        return Render::getInstance()->render($template_name, $this->template_data);
    }
}

App\HttpTemplate\Index\index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>视频模板测试</title>
</head>
<body>
<ul>
    {foreach $user_list as $key => $val}
    <li>{$key} => {$val}</li>
    {/foreach}
</ul>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《云原生安全攻防》-- K8s网络策略:通过NetworkPolicy实现微隔离

默认情况下&#xff0c;K8s集群的网络是没有任何限制的&#xff0c;所有的Pod之间都可以相互访问。这就意味着&#xff0c;一旦攻击者入侵了某个Pod&#xff0c;就能够访问到集群中任意Pod&#xff0c;存在比较大的安全风险。 在本节课程中&#xff0c;我们将详细介绍如何通过N…

06 APP 自动化- H5 元素定位

文章目录 H5 元素定位1、APP 分类2、H5 元素3、H5 元素定位环境的搭建4、代码实现&#xff1a; H5 元素定位 1、APP 分类 1、Android 原生 APP2、混合 APP(Android 原生控件H5页面)3、纯 H5 App 2、H5 元素 H5 元素容器 WebViewWebView 控件实现展示网页 3、H5 元素定位环…

定时线程池失效问题引发的思考

最近在做的一个新功能&#xff0c;在结果探测的时候使用了定时线程池和普通线程池结合&#xff0c;定时线程池周期性创建子任务并往普通线程池提交任务。 问题&#xff1a; 在昨天测试老师发现&#xff0c;业务实际上已经成功了&#xff0c;但是页面还是一直显示进行中。 收到…

AXURE安装+汉化-Windows

安装网站&#xff1a;https://www.axure.com/release-history/rp9 Axure中文汉化包下载地址 链接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取码:5418 下载完成之后&#xff0c;crtlc lang文件夹 到下载的Axure路径下 双击点进这个目录里面。ctrlv把lan…

ArcGIS Pro字段计算器与计算几何不可用,显示灰色

“字段计算器”不可用 如果计算字段命令不可用&#xff0c;请考虑以下可能性&#xff1a; 由 ArcGIS 管理的字段无法手动编辑。因此&#xff0c;无法计算 ObjectID&#xff08;OID 或 FID&#xff09;字段或地理数据库要素类的 Shape_Length 和 Shape_Area 字段的字段值。表中…

mac电脑安装 nvm 报错如何解决

前言 已知&#xff1a;安装nvm成功&#xff1b;终端输入nvm -v 有版本返回 1. 启动全局配置环境变量失败 source ~/.zshrc~ 返回&#xff1a; source: no such file or directory: /Users/你的用户名/.zshrc~2 安装node失败 nvm install 16.13返回&#xff1a; mkdir: /U…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用&#xff0c;Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分&#xff0c;文件和模块是一一对应的。换言之&#xff0c;一个 Node.js 文件就是一个模块&#xff0c;这个文件可能是JavaScript 代码、JSON 或者编译过的…

上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备

大名鼎鼎的中微半导体招聘文档工程师了&#xff0c;就是那家由中国半导体产业的领军人物尹志尧领导的、全员持股的公司。如果你还不了解他&#xff0c;赶快Deepseek一下“尹志尧”了解。 招聘职位&#xff1a;Technical Writer & Senior Technical Writer 公司名称&#…

Python微积分可视化:从导数到积分的交互式教学工具

Python微积分可视化:从导数到积分的交互式教学工具 一、引言 微积分是理解自然科学的基础,但抽象的导数、积分概念常让初学者感到困惑。本文基于Matplotlib开发一套微积分可视化工具,通过动态图像直观展示导数的几何意义、积分的近似计算及跨学科应用,帮助读者建立"数…

Juce实现Table自定义

Juce实现Table自定义 一.总体展示概及概述 在项目中Juce中TableList往往无法满足用户需求&#xff0c;头部和背景及背景颜色设置以及在Cell中添加自定义按钮&#xff0c;所以需要自己实现自定义TabelList&#xff0c;该示例是展示实现自定义TableList&#xff0c;实现自定义标…

【后端高阶面经:架构篇】51、搜索引擎架构与排序算法:面试关键知识点全解析

一、搜索引擎核心基石&#xff1a;倒排索引技术深度解析 &#xff08;一&#xff09;倒排索引的本质与构建流程 倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎实现快速检索的核心数据结构&#xff0c;与传统数据库的正向索引&#xff08;文档→关键词&#xff0…

Windows应用-音视频捕获

下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源&#xff0c;可以监视视频源图像&#xff0c;监听音频源&#xff1b;可以将视频源图像写入MP4文件&#xff0c;将音频源写入MP3或WAV文件&#xff1b;还可以录制系统播放的声音。本应用使用MFC对话框…

【OCCT+ImGUI系列】012-Geom2d_AxisPlacement

Geom2d_AxisPlacement 教学笔记 一、类概述 Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴&#xff08;轴系&#xff09;&#xff0c;由两部分组成&#xff1a; gp_Pnt2d&#xff1a;原点&#xff08;Location&#xff09;gp_Dir2d&#xff1a;单位方向向量&#xff…

【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!

&#x1f4dd;本篇摘要 在本篇将介绍C定长内存池的概念及实现问题&#xff0c;引入内存池技术&#xff0c;通过实现一个简单的定长内存池部分&#xff0c;体会奥妙所在&#xff0c;进而为之后实现整体的内存池做铺垫&#xff01; &#x1f3e0;欢迎拜访&#x1f3e0;&#xff…

mac下通过anaconda安装Python

本次分享mac下通过anaconda安装Python、Jupyter Notebook、R。 anaconda安装 点击&#x1f449;https://www.anaconda.com/download&#xff0c; 点击Mac系统安装包&#xff0c; 选择Mac芯片&#xff1a;苹果芯片 or intel芯片&#xff0c; 选择苹果芯片图形界面安装&#x…

微软PowerBI考试 PL300-Power BI 入门

Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南&#xff0c;今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案&#xff0c;通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…

逻辑回归知识点

一、逻辑回归概念 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计方法&#xff0c;尤其适用于二分类问题。 注意: 尽管名称中有"回归"二字&#xff0c;但它实际上是一种分类算法。 解决二分类的问题。 API&#xff1a;sklearn.linear_model.Logis…

Ubuntu22.04 安装 CUDA12.8

1.下载CUDA 由于我装完 Ubuntu22.04 后就自动带了最新的显卡驱动&#xff0c;就没有再去配置驱动。 先查看驱动能支持的CUDA最高版本&#xff0c;这里显示可支持到12.8。 nvidia-smi在CUDA的 说明文档 可查看CUDA对应的驱动版本要求。 在 CUDA Toolkit Archive 查找需要的 …

Android的uid~package~pid的关系

UID &#xff1a; Linux 系统级用户标识&#xff0c;Android 中每个应用安装时分配唯一 UID&#xff08;如 1000&#xff09;。 Package&#xff1a; Android 应用包名(例如android)&#xff0c;一个 UID 可关联多个 Package&#xff08;共享 UID 场景如android:sharedUserI…

20250530-C#知识:万物之父Object

C#知识&#xff1a;万物之父Object Object类&#xff08;即object&#xff09;是所有类的基类&#xff0c;这里面的方法还是需要好好了解一下。 1、Object类 是顶级父类&#xff0c;其他类默认都是Object类的子类&#xff08;自定义类也会默认继承Object类&#xff09;可以用O…