正确使用 GuzzleHttp/Psr7/Response

2024-07-01

不确定在 php 页面中显示 Psr7 Guzzle Response 的正确方法是什么。

现在,我正在做:

use GuzzleHttp\Psr7\BufferStream;
use GuzzleHttp\Psr7\Response;

class Main extends \pla\igg\Main
{
    function __construct()
    {

        $stream = new BufferStream();
        $stream->write("Hello I am a buffer");

        $response = new Response();
        $response = $response->withBody($stream);
        $response = $response->withStatus('201');
        $response = $response->withHeader("Content-type", "text/plain");
        $response = $response->withAddedHeader("IGG", "0.4.0");

        //Outputing the response
        http_response_code($response->getStatusCode());

        foreach ($response->getHeaders() as $strName => $arrValue)
        {
            foreach ($arrValue as $strValue)
            {
                header("{$strName}:{$strValue}");
            }
        }


        echo $response->getBody()->getContents();

    }
}

有没有更 OOP 的方式来显示响应?


做同样事情的一种更 OOP 的方法是创建一个 Sender 对象,它需要ResponseInterface在它的构造函数中。该类将负责设置标头、清除缓冲区并呈现响应:

use Psr\Http\Message\ResponseInterface;

class Sender
{
    protected $response;

    public function __construct(ResponseInterface $response)
    {
        $this->response = $response;
    }

    public function send(): void
    {
        $this->sendHeaders();
        $this->sendContent();
        $this->clearBuffers();
    }

    protected function sendHeaders(): void
    {
        $response = $this->response;
        $headers  = $response->getHeaders();
        $version  = $response->getProtocolVersion();
        $status   = $response->getStatusCode();
        $reason   = $response->getReasonPhrase();

        $httpString = sprintf('HTTP/%s %s %s', $version, $status, $reason);

        // custom headers
        foreach ($headers as $key => $values) {
            foreach ($values as $value) {
                header($key.': '.$value, false);
            }
        }

        // status
        header($httpString, true, $status);
    }

    protected function sendContent()
    {
        echo (string) $this->response->getBody();
    }

    protected function clearBuffers()
    {
        if (function_exists('fastcgi_finish_request')) {
            fastcgi_finish_request();
        } elseif (PHP_SAPI !== 'cli') {
            $this->closeOutputBuffers();
        }
    }

    private function closeOutputBuffers()
    {
        if (ob_get_level()) {
            ob_end_flush();
        }
    }
}

像这样使用它:

$sender = new Sender($response);
$sender->send();

更好的是,您可以将 Sender 注入您的应用程序对象并将其转换为类变量,因此您可以这样调用它:

function renderAllMyCoolStuff()
{
    $this->sender->send();
}

我将把它作为读者的练习来实现 Response 对象的 getter 和 setter,以及接收一些内容字符串并将其内部转换为 Response 对象的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确使用 GuzzleHttp/Psr7/Response 的相关文章

  • 致命错误:嵌套级别太深 - 递归依赖?

    我有一个复杂的嵌套对象层次结构 所有子对象 在父类中存储了一个对象数组 都包含链接回其父级的属性 相当简单明了 没有真正的问题 如果我对层次结构中的任何对象执行 var dump 我将在转储中获得递归引用 正如我所期望的那样 FIRSTGE
  • Yii 模块国际化

    Yii Doc 模块可以无限嵌套 水平 也就是说 一个模块可以包含 另一个模块还可以包含 另一个模块 我们称前者为 父模块 而后一个子模块 模块 必须声明子模块 在他们的模块属性中 父模块 就像我们声明模块一样 在显示的应用程序配置中 如上
  • pdf下载 html2pdf

    我正在使用 html2pdf 类来生成 pdf 在我的问题中 它为 html 代码生成 pdf 但它没有提供下载该 pdf 的对话框选项 请帮助我的情况如下
  • CSRF 令牌无效。请尝试重新提交表格

    每次尝试提交表单时 我都会收到此错误消息 CSRF 令牌无效 请尝试重新提交表格 我的表单代码是这样的
  • in_array 与 isset - 性能

    考虑以下代码片段 例子 1 array Array 1 2 3 4 5 6 7 array test Array 3 5 4 7 3 6 7 8 8 9 3 foreach array test as value if in array v
  • WebSocket 已处于 CLOSING 或 CLOSED 状态。

    我尝试使用 Javascript PHP 和 Wamp 执行 WebSocket 但在发送时出现错误 WebSocket 已处于 CLOSING 或 CLOSED 状态 我已经使用了源代码here http sii rennes devel
  • 可以用 PHP 设置表单字段值吗?

    我使用 GET 函数从 url http index html variable value 中提取一个带有 php 的值 这是基本的东西 但是 我需要在我的表单中使用该值 通常 我会设置 或类似的东西 但是 我无法使用我正在使用的编辑器在
  • 分页打印所有数据

    我在打印数据表中具有分页的所有数据时遇到问题 我已经做过研究并在此链接中发现了同样的问题 仅打印 https stackoverflow com questions 468881 print div id printarea div onl
  • 如何对 bcmath 数字进行向上、向下和舍入?

    我需要模仿的确切功能ceil http php net manual en function ceil php floor http www php net manual en function floor php and round ht
  • 正确使用 GuzzleHttp/Psr7/Response

    不确定在 php 页面中显示 Psr7 Guzzle Response 的正确方法是什么 现在 我正在做 use GuzzleHttp Psr7 BufferStream use GuzzleHttp Psr7 Response class
  • 谷歌纬度返回空位置资源。这个 Oauth 流程有什么问题吗?

    使用示例我有这段代码 它工作正常 授权适当的范围和一切
  • 在ubuntu上安装php70-gd

    最近新的php7已经发布了 但是 当我尝试安装 gd 包时 找不到该库 我已经尝试过 sudo apt get install php70 gd and sudo apt get install php70 php gd 有人知道 gd 是
  • 文件上传:完成百分比进度条

    我正在尝试为头像上传添加 到目前为止完成的百分比 进度条巴迪出版社 https github com buddypress BuddyPress 目的是阻止用户在上传完成之前离开页面 上传过程由 BuddyPress 处理bp core a
  • 通过 php 请求表单名称[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 当我提交表单时 我想从 php 检索
  • 有 PHP 函数可以解决这个问题吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对不起 我希望这并不奇怪或什么 我该如何修复这个编码 您遇到的情况是数据以一种编码写入并解释为另一种编码的结果 您需要确保请求输入的格
  • 如何通过PHP获取div?

    我得到一个页面使用file get contents来自远程服务器 但我想过滤该页面并从中获取一个使用 PHP 具有 text 类的 DIV 我开始于DOMDocument但我现在迷路了 有什么帮助吗 file file get conte
  • 使用 AJAX 提交表单,将表单数据传递给 PHP,无需刷新页面 [重复]

    这个问题在这里已经有答案了 谁能告诉我为什么这段代码不起作用
  • 为什么 PHP 函数调用*如此*昂贵?

    PHP 中的函数调用是昂贵的 这是一个测试它的小基准
  • 购物车商品未显示在客户视图中

    运行 Magento 1 7 2 当在管理员的客户视图中时 它显示客户购物车中的 1 件商品 但不显示详细信息 我附上了屏幕截图 有谁知道问题可能是什么 或者您能否验证它是否正常工作 以便我知道这是我的安装 Thanks 在此处查看屏幕截图
  • PHPStorm + PHPUnit 颜色输出

    因此 我在 PHPStorm 7 1 中运行 PHPUnit 但我不知道如何在测试中使 ANSI 颜色代码正常工作 我的 PHPunit xml 有colors true 在属性列表中 但每次我尝试类似的操作 echo 033 31mErr

随机推荐

  • 使用多处理或线程加速单个任务

    是否可以使用多处理 线程来加速单个任务 我的直觉是答案是否定的 以下是我所说的 单一任务 的示例 for i in range max pick random choice on off both 当参数为 10000000 时 在我的系统
  • 配置 SourceTrail 以接受带有 @ 语法的嵌入式 c/c++ 头文件

    我正在尝试使用 Sourcetrail https www sourcetrail com https www sourcetrail com 快速了解 pic18 系列微控制器的一些旧嵌入式 c c 源代码 导入硬件包含文件时出现错误 该
  • 在 PowerShell 中更改错误消息语言

    我正在尝试在 powershell 中以英文显示错误 以便我可以更轻松地在线搜索它们 当出现错误时 它会以法语显示 如下所示 PS C Users Olivier lpthw gt type nul gt ex2 py type Impos
  • 使用具有阿拉伯字符的 json.dumps 将字典转换为 json [重复]

    这个问题在这里已经有答案了 我有一本包含阿拉伯语单词的字典 例如 data name name print json dumps data file open data json a encoding utf 8 Output name u
  • 在Python中使用argparse解析整个JSON

    我正在尝试使用 ARGPARSE 库在一个简单的参数中解析整个 Json 问题是当它遇到儿子内部的不同元素 例如 和 时 它会突然停止 这是测试代码 parse py import argparse parser argparse Argu
  • 从 Google 地图中的纬度、经度搜索生成英国邮政编码

    我正在尝试通过 Google 地图中的纬度和经度搜索生成英国邮政编码 例如 在 Google 地图中搜索 57 350237 1 977539 将返回以下内容 https i stack imgur com mSULM png https
  • UIProgressView 没有更新?

    我已经开始在 iOS5 中使用 UIProgressView 但还没有真正使用它 我在更新视图时遇到问题 每次更新进度后 我都有一组连续的操作 问题是 进度视图不是一点一点更新的 而是在全部完成之后才更新 事情是这样的 float cnt
  • 如何使用元类中的方法更改 groovy 中方法的行为

    我想通过以下方式 破坏 Groovy 中的 plus 方法 Integer metaClass plus Integer n gt delegate n 1 assert 2 2 5 我收到 StackOverflowException 这
  • HTTPS文件下载C#

    我需要下载隐藏在 HTTPS 连接后面的文件 我对下载安全网站后面的文件不熟悉 我尝试使用凭据来解决此问题 但无济于事 据我所知 您需要创建并使用证书来完成此操作 但我没有找到任何示例 任何帮助表示赞赏 这就是我现在所拥有的 WebClie
  • FullCalendar 日期之间的分割线

    我正在使用 jquery fullcalendar 它工作得很好 但是在议程周视图中 日期之间没有分界线 我查看了 fullcalendar 网站 甚至试图找到 css 处理显示分界线的方式 但没有成功 如何显示日期分割线 Thanks 我
  • Oracle 难以管理简单任务的说法正确吗?没有优质的管理应用程序吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在这里看到这个说法是在咆哮中提出的http discuss joelonsoftware com default asp joel 3 456
  • 有人可以推荐 java 8 模式来替换 switch 语句吗?

    我有以下代码 public class A private String type String getType return type 现在在许多代码位置我都有这样的代码 switch a geType case A return new
  • 将静态站点生成器与 php 集成

    我目前正在使用 php 构建一个不需要定期更新的网站 并且我考虑使用静态站点生成器 因为它将具有类似博客的功能 然而 我的网站包含一个将与数据库链接的表单 我遇到的问题是静态站点生成器无法识别和解析 php 我目前正在考虑使用三个静态站点生
  • 带骨干的递归函数jquery

    我在主干中有一个应用程序 我想在 Json 中找到一些记录并打印出来 我的 JSON 是这样的 id r1 hotel id 1 name Single level 1 id r1 1 hotel id 1 name Double leve
  • 无法将 Angular 更新到版本 6

    我正在尝试将角度更新到最新版本 我已经更新了全局 angular cli npm install g angular cli 然后当我尝试使用更新本地 angular cli 时ng update angular cli我收到此错误 Err
  • 使用psql以SSL方式连接PostgreSQL

    我正在尝试为 PostgreSQL 服务器配置 ssl 证书 我在数据目录中创建了一个证书文件 server crt 和密钥 server key 并将参数SSL更新为 on 以启用安全连接 我只希望服务器在客户端使用服务器证书进行身份验证
  • 使用协处理器HBase创建二级索引

    我一直在尝试编写自己的协处理器 使用 prePut 挂钩创建二级索引 首先 我只是尝试让 prePut 协处理器工作 到目前为止 我可以将协处理器添加到传递给它的 put 对象中 我发现我无法让协处理器写入与传入的 put 对象正在写入的行
  • 可以使用 libSegFault.so 获取 SIGABRT 的回溯吗?

    神奇的咒语 LD PRELOAD lib libSegFault so someapp runs someapplibSegFault so 提供有关 SIGSEGV 的回溯信息 如中所述many http blogs fau de wit
  • 快速判断文件是否为有效视频

    确定文件是否是可播放视频的最快方法是什么 我不关心它是否腐败 只关心它是否是哑剧类型should可以在 iPad 上播放 我玩过将文件推送到NSURL正如另一个问题所建议的 但每个文件可能需要 gt 1 秒 这太慢了 我目前正在查看文件扩展
  • 正确使用 GuzzleHttp/Psr7/Response

    不确定在 php 页面中显示 Psr7 Guzzle Response 的正确方法是什么 现在 我正在做 use GuzzleHttp Psr7 BufferStream use GuzzleHttp Psr7 Response class