hypef 五、请求及响应

news2024/12/24 0:14:40

文档地址

Hyperf

https://hyperf.wiki/2.0/#/zh-cn/response

一、请求

1.1 安装

composer require hyperf/http-message

 框架自带不用手动安装。

1.2 请求对象

      在 onRequest 生命周期内可获得Hyperf\HttpServer\Request对象。

  可以通过以来注入和路由对应参数获取。

declare(strict_types=1);

namespace App\Controller;

use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Annotation\AutoController;

/**
 * @AutoController()
 */
class IndexController
{
    public function info(RequestInterface $request, int $id)
    {
        $r_id = $request->route('id');
        // 存在则返回,不存在则返回默认值 0
        $r_id = $request->route('id', 0);
    }
    public function info2()
    {
        $r_id = $this->request->route('id');
        // 存在则返回,不存在则返回默认值 0
        $r_id = $this->request->route('id', 0);
    }
}

 1.3 获取请求内容

#获取路径
$uri = $request->path();

#验证路由匹配
if ($request->is('user/*')) {
    // ...
}

#获取url 无参数
$url = $request->url();

#获取url 带参数
$url = $request->fullUrl();

#获取请求方法
$method = $request->getMethod();

if ($request->isMethod('post')) {
    // ...
}

#获取所有输入】
$all = $request->all();

#获取指定输入
$name = $request->input('name');
$name = $request->input('name', 'Hyperf');
$name = $request->input('products.0.name');
$names = $request->input('products.*.name');

#从查询字符串中取出
$name = $request->query();
$name = $request->query('name');//默认null
$name = $request->query('name', 'Hyperf');

#获取josn信息
$name = $request->input('user.name');
$name = $request->input('user.name', 'Hyperf');
$name = $request->all();//以数据形式返回

#判断是否存在
if ($request->has('name')) {
    // ...
}
#同时判断多个值
if ($request->has(['name', 'email'])) {
    // ...
}

 1.4 PRS-7请求及方法

hyperf/http-message组件实现PSR-7标准。

注入时声明为 PSR-7 标准的 Psr\Http\Message\ServerRequestInterface 接口,则框架会自动转换为等同于 Hyperf\HttpServer\Contract\RequestInterfaceHyperf\HttpServer\Request 对象。

建议使用 Hyperf\HttpServer\Contract\RequestInterface 来注入,这样可获得 IDE 对专属方法的自动完成提醒支持。

1.5 cookies

#获取所有cookies
$cookies = $request->getCookieParams();

#获取单个
$name = $request->cookie('name');
$name = $request->cookie('name', 'Hyperf');

1.6 文件

SplFileInfo文档:PHP: SplFileInfo - Manual

Hyperf\HttpMessage\Upload\UploadedFile::file()从请求中获取上传的文件对象,返回Hyperf\HttpMessage\Upload\UploadedFile 类的实例,UploadedFile类继承SplFileInfo。

Hyperf\HttpServer\Reques继承Hyperf\HttpServer\Contract\RequestInterface,RequestInterface继承sr\Http\Message\ServerRequestInterface,RequestInterface其中有定义file(),Reques实现file。

 #Hyperf\HttpServer\Request 
    /**
     * Retrieve a file from the request.
     *
     * @param null|mixed $default
     * @return null|UploadedFile|UploadedFile[]
     */
public function file(string $key, $default = null)
    {
        return Arr::get($this->getUploadedFiles(), $key, $default);
    }
public function getUploadedFiles()
    {
        return $this->call(__FUNCTION__, func_get_args());
    } 
protected function call($name, $arguments)
    {
        $request = $this->getRequest();
        if (! method_exists($request, $name)) {
            throw new \RuntimeException('Method not exist.');
        }
        return $request->{$name}(...$arguments);
    }



#Hyperf\HttpMessage\Upload\UploadedFile
class UploadedFile extends \SplFileInfo implements UploadedFileInterface
{
}
#获取上传文件
$file = $request->file('photo');

#检查文件是否存在
if ($request->hasFile('photo')) {
    // ...
}

#验证上传
if ($request->file('photo')->isValid()) {
    // ...
}

#获取文件路径
$path = $request->file('photo')->getPath();

#获取扩张名
$extension = $request->file('photo')->getExtension();

#存储上传文件
$file = $request->file('photo');
$file->moveTo('/foo/bar.jpg');

// 通过 isMoved(): bool 方法判断方法是否已移动
if ($file->isMoved()) {
    // ...
}

 

二、响应

2.1 返回数据

Hyperf\HttpServer\Response中定义犯法并使用对应类处理。

public function write(string $data): bool
    {
        $response = $this->getResponse();
        if ($response instanceof Chunkable) {
            return $response->write($data);
        }

        return false;
    }
public function json($data): PsrResponseInterface
    {
        $data = $this->toJson($data);
        return $this->getResponse()
            ->withAddedHeader('content-type', 'application/json; charset=utf-8')
            ->withBody(new SwooleStream($data));
    }
 public function xml($data, string $root = 'root'): PsrResponseInterface
    {
        $data = $this->toXml($data, null, $root);
        return $this->getResponse()
            ->withAddedHeader('content-type', 'application/xml; charset=utf-8')
            ->withBody(new SwooleStream($data));
    }
public function raw($data): PsrResponseInterface
    {
        return $this->getResponse()
            ->withAddedHeader('content-type', 'text/plain; charset=utf-8')
            ->withBody(new SwooleStream((string) $data));
    }
public function redirect(
        string $toUrl,
        int $status = 302,
        string $schema = 'http'
    ): PsrResponseInterface {
        $toUrl = value(function () use ($toUrl, $schema) {
            if (! ApplicationContext::hasContainer() || Str::startsWith($toUrl, ['http://', 'https://'])) {
                return $toUrl;
            }
            /** @var Contract\RequestInterface $request */
            $request = ApplicationContext::getContainer()->get(Contract\RequestInterface::class);
            $uri = $request->getUri();
            $host = $uri->getAuthority();
            // Build the url by $schema and host.
            return $schema . '://' . $host . (Str::startsWith($toUrl, '/') ? $toUrl : '/' . $toUrl);
        });
        return $this->getResponse()->withStatus($status)->withAddedHeader('Location', $toUrl);
    }
protected function toJson($data): string
    {
        try {
            $result = Json::encode($data);
        } catch (\Throwable $exception) {
            throw new EncodingException($exception->getMessage(), $exception->getCode());
        }

        return $result;
    }
    protected function toXml($data, $parentNode = null, $root = 'root'): string
    {
        return Xml::toXml($data, $parentNode, $root);
    }

    
    protected function getResponse()
    {
        if ($this->response instanceof PsrResponseInterface) {
            return $this->response;
        }

        return Context::get(PsrResponseInterface::class);
    }

 这块设计几乎是整个Response类,显示可以写入数据和获取请求数据。

#返回json
return $response->json($data);

#返回xml
return $response->xml($data);

#返回raw
return $response->raw('Hello Hyperf.');

#重定向
return $response->redirect('/anotherUrl');

#cookie设置
$cookie = new Cookie('key', 'value');
return $response->withCookie($cookie)->withContent('Hello Hyperf.');

#文件下载
return $response->download(BASE_PATH . '/public/file.csv', 'filename.csv');

三、其他相关

两个教程里涉及 immutable 机制,是php7优化内容。

3.1 immutable机制

文档https://blog.blackfire.io/php-7-performance-improvements-immutable-arrays.html

 immutable机制为php7优化内容,使为修改或复制过的变量仅创建一次,对框架中规模比较大的变量减少创建时间,也意味着immutable的变量不可修改。

3.2 Packed arrays

 写成中文大概是拥挤数组/(ㄒoㄒ)/~~ 英语不好。

也是php7优化的一部分,文档:https://blog.blackfire.io/php-7-performance-improvements-packed-arrays.html

对应数据特征:

1、key是数字

2、键以仅增长模式插入数组

对于这种数据减少的内存的消耗。

3.3 整数、浮点数内存分配

https://blog.blackfire.io/php-7-performance-improvements-ints-floats-free.html

在PHP 7中,变量在内存中的分配方式发生了巨大变化。它们从存储在堆中变为存储在堆栈内存池中

3.4 字符串优化

PHP 7 performance improvements (3/5): Encapsed strings optimization - Blackfire.io Le Blog | Fire up your web application performancep

 php5中字符串和变量混写,如"asd $a",会先分配不同缓冲区拼合后在分配到新缓冲区,最后拼合完释放所有中间缓冲区返回最后缓冲区。

php7中针对这样的字符串会创建堆栈,将所有需要连接的元素堆叠起来。当到达封装字符串的末尾时:使用总大小执行一次且仅一次内存分配,并将每个数据块移动到正确的位置。

 3.5 引用不匹配优化

PHP 7 performance improvements (4/5): References mismatch - Blackfire.io Le Blog | Fire up your web application performance

根据文章内容,使用&$value时无对应操作,php5中会再浪费内存复制数据,数据比较大时非常浪费。在PHP7中,当引擎想要从非引用变量创建引用时,它只需将后者封装到新创建的前者中,仅此而已。任何地方都没有内存副本。这是因为在PHP7中,变量在内部的工作方式非常不同,并且引用已经被深度修改。

/(ㄒoㄒ)/~~优化内容部分机翻的,没看懂。但主要意思是,由于php7变量引用的优化,貌似是变量引用时不费内存,赋值写时发生复制。

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

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

相关文章

我的创作纪念日 --- 简单记录

理想并不是一种空虚的东西,也并不玄奇;它既非幻想,更非野心,而是一种追求善美的意识。 机缘 大家好,今天是我成为创作者的第256天,也是我在CSDN上发布的第81篇文章。在这里,我想和大家简单记…

C#(五十五)之线程死锁

死锁是指多个线程共享资源是&#xff0c;都占用同意部分资源&#xff0c;而且都在等待对方师范另一部分资源&#xff0c;从而导致程序停滞不前的情况 示例&#xff1a; /// <summary>/// 定义一个刀/// </summary>public static object knife new object();/// …

git install报错问题

报错如下&#xff1a; fatal: unable to connect to githurb.com: 运行如下命令即可&#xff1a; git config --global url.https://github.com/.insteadOf git://github.com/ git config --global url."https://".insteadOf git://接着再删除node_moudels包&…

Spring Boot 操作 Redis 的各种实现

一、Jedis,Redisson,Lettuce三者的区别 共同点&#xff1a;都提供了基于Redis操作的Java API&#xff0c;只是封装程度&#xff0c;具体实现稍有不同。 不同点&#xff1a; 1.1、Jedis 是Redis的Java实现的客户端。支持基本的数据类型如&#xff1a;String、Hash、List、Se…

卡尔曼滤波实例分析(二)

1 问题 假设一物体以一初速度 v 0 v_0 v0​位于一高度为 y 0 y_0 y0​处正处于匀速下降状态&#xff0c;此时该物体启动制动装置&#xff0c;以一个加速度为 a a a的作用力反向运动 &#xff08;1&#xff09;建模 速度&#xff1a; V V 0 − a ∗ t V V_0 - a*t VV0​−a∗…

API6中JS UI实现富文本组件居右显示

【关键字】 RichText、富文本组件、API6、JS UI、居右显示 【关键代码如下】 index.hml <div class"container"><text>文本行高</text><text>文本行高</text><text>文本行高</text><text>文本行高</text>&…

SciencePub学术 | 计算机与生物信息类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 计算机与生物信息类重点SCIE&EI征稿中&#xff01;信息如下&#xff0c;录满为止&#xff1a; 一、期刊概况&#xff1a; 计算机与生物信息类重点SCIE&EI 【期刊简介】IF&#xff1a;7.5-8.0&#xff0c;JCR1区&#xff0c;中科院1区TOP&…

vscode设置自己用的注释格式

ctrlshiftP 打开设置 输入snippets&#xff0c;选择配置用户代码片段[Snippets: Configure User Snippets]输入JavaScript&#xff0c;选择JavaScript.json 把这段代码替换进去 "Print to jsNoteTitle": {"prefix": "jsNoteTitle","body&q…

阿里云国际站:阿里云还值得我们期待吗?

阿里云还值得我们期待吗&#xff1f;   "阿里云&#xff0c;还可以继续期待吗&#xff1f;"这是一个近期在各大行业论坛和科技洪流之中频繁引发热议的问题。然而&#xff0c;深究其实质&#xff0c;答案不言自明——无须怀疑&#xff0c;阿里云绝对值得我们赋予期待…

MTK日志路径——aosp\device\mediatek\common\mtklog

这里写目录标题 device\mediatek\common\mtklog1.mtklog-config-basic-eng.prop2.mtklog-config-basic-user.prop3.mtklog-config-bsp-eng.prop4.mtklog-config-bsp-user.prop device\mediatek\common\mtklog 在安卓源码中&#xff0c;device\mediatek\common\mtklog目录包含了…

解决node+mysql不能保存emoji表情包的问题

效果图 1.前端 2.数据库 实现 Emoji表情是4个字节&#xff0c;而mysql的utf8编码最多3个字节&#xff0c;所以数据插不进去&#xff0c;而utfmb64是支持四个字节的。所以需要将mysql编码从utf8转换成utf8mb4&#xff0c;从【数据库、表、相应字段】都需要修改为utf8mb4&…

Flask+Vue+小程序电商生态系统

完整资料进入【数字空间】查看——baidu搜索"writebug" 本项目为FlaskVue小程序全栈开源电商生态系统。本项目使用的技术有&#xff1a;前端&#xff1a;VueIviewWxxcx&#xff1b;后端&#xff1a;FlaskMysql&#xff1b;部署&#xff1a;NginxGunicorn。该项目包含…

C++—异常与类型转换、大小端存储、不使用额外空间的情况下交换两个数

异常 常见的异常包括&#xff1a;数组下标越界&#xff0c;除法计算的时候除数为0&#xff0c;动态分配空间时空间不足。 try&#xff0c;throw&#xff0c;catch #include <iostream> using namespace std; int main() {double m 1, n 0;try {cout << "b…

其实,大多数的项目经理都是在假装努力罢了

早上好&#xff0c;我是老原。 有很多项目经理平时忙的团团转&#xff0c;看起来努力的不行&#xff0c;但实际上进度缓慢、结果不佳&#xff0c;更别说个人成长了&#xff0c;问就是工作都这么忙了&#xff0c;哪有时间。 说来也能理解&#xff0c;毕竟现在不是007就是996&a…

spring整合RabbitMQ

先导入依赖POM.xml 之前导的不全一直报错后面导入的可能有多的 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

Python3,66行代码,搞了个音乐下载器,从此听歌再也不需要花费银子了,真香!

66行代码敲出音乐下载器 1、引言2、代码实战2.1 思路2.2 安装2.3 示例 3、 总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;最近比较流行的那首歌&#xff0c; 咋又说费了。 小鱼&#xff1a;那你就冲个VIP呗。 小屌丝&#xff1a;开玩笑&#xff0c; 我的钱又不是大风刮过来…

第2集丨JavaScript 中原型链(prototype chain)与继承

目录 一、一些基础概念1.1 ECMAScript 标准1.2 prototype和 __proto__1.3 constructor属性1.4 函数名 二、原型链的维护2.1 内部原型链和构造器原型链2.2 从实例回溯原型链2.3 修正原型指向 三、基于原型链的继承3.1 继承属性3.2 继承“方法” 四、构造函数4.1 案例一个简单的实…

SAP S4 Hana 财务凭证存储表变化

一、统一日记账的表 1. ACDOCA里有的&#xff0c;BSEG里不一定有 以下的一些凭证行项目&#xff0c;都是只在ACDOCA表里面存在&#xff0c;而在BSEG表里不存在的&#xff08;你可以通过BKPF表的BSTAT字段的凭证状态U来识别&#xff09;&#xff1a; 资产折旧过账 特定账套&am…

VMware Workstation虚拟机如何连接usb网卡

小伙伴不知道怎么将网卡链接到VMware虚拟机系统里面&#xff0c;因此今天我们就做一个简单的教程&#xff0c;教大家如何连接虚拟机使用&#xff1a; 1.插上usb网卡&#xff0c;然后如下图所示操作&#xff1a; 2.点击连接网卡到虚拟机之后&#xff0c;查询一下网卡是否识别到…

【JAVA程序员学C++】第二节、引用与指针,类型转换,结构体

一、指针与引用 1.1 指针 先说指针&#xff0c;由于java有jvm&#xff0c;所以对于java程序员&#xff0c;对于内存这一块关注就毕竟少了。但是C不同&#xff0c;C里面所有的堆内存&#xff0c;都需要程序员自己把控&#xff0c;把控不好&#xff0c;泄露了也是常有的事情。 …