问题标签 [psr-7]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
444 浏览

php - 将 Zend Diactoros PhpInputStream (PSR-7 StreamInterface) 包装的流传递给类似 fopen 的函数?

我必须编写一些东西来处理通过 POST 发送的 XML 文档。该文档内部包含 base-64 编码的二进制文件,因此请求可能非常大。

这有效:

但我正在使用 Zend Diactoros PSR-7 实现,所以我真的应该做这样的事情:

但是,这会导致流被转换为导致错误的字符串。

我真正需要的是:

因为:

但注意->stream是受保护的。我应该扩展Zend\Diactoros\PhpInputStream并编写一个公共方法来公开->stream吗?或者,还有更好的方法?


请注意:我正在寻找基于流的解决方案;不要将整个流作为字符串读入内存。

0 投票
1 回答
133 浏览

php - 图像仅在流式传输(?)到客户端时加载某些时间

我一直在编写一个网络应用程序一段时间,并且在提供图像方面遇到了一些问题。

我的代码使用 ,从服务器中提取文件数据file_get_contents,并使用 Slim 的Request对象write方法输出文件的内容,设置标题。对于大多数文件,这是可行的,但是较大的图像通常只显示图像尺寸的灰色轮廓(在移动和桌面 Chrome 中测试)。Requests error out with ERR_SPDY_PROTOCOL_ERROR,这让我相信这是一个 HTTP 2 问题(我测试的服务器侦听 HTTP 2 连接,使用listen [port] http2其 nginx 配置中的指令设置),但是我试图降级响应中使用的 HTTP 版本使用 PSR-7 的RequestInterface方法withProtocolVersion并没有改变。

我知道使用file_get_contents然后输出所述内容是一种非常迂回的做事方式,但这是我知道允许此应用程序的用户任意设置上传文件的位置的唯一方法。

这是我的代码中最相关的部分,其中$filepath是用户请求的文件的路径。此代码对除大图像之外的所有文件都按预期工作。

0 投票
2 回答
1449 浏览

php - 服务器端请求的含义

我想知道是否有人可以向我解释服务器端请求的含义。这可能只是我不太明白的术语。对我来说,这听起来像是从服务器到客户端的请求,但我不认为就是这样。

这是关于 PHP PSR7 的。我试图弄清楚为什么它同时具有RequestInterfaceServerRequestInterface. 我无法在任何地方对它进行任何细化,也看不出为什么这两个不只是合并到一个界面中的原因。

0 投票
4 回答
6995 浏览

php - 如何从 Slim 3 php 框架访问所有路由?

我正在尝试从 Slim 框架中定义的路由构建一个动态下拉菜单,这是我的问题 - 有没有办法从某种数组访问所有定义的静态路由?

例如,如果我这样定义我的路线:

每个文件都是一个单独的页面,如下所示

我想从某种数组访问所有这些定义的路由,然后使用该数组在我的模板文件中创建一个无序的 HTML 列表。

每当我更改定义的路线时,我都希望此菜单随之更改。有没有办法做到这一点?

0 投票
1 回答
151 浏览

php - 对 slimframework 的不可变响应有问题

我正在尝试使用苗条框架版本 3 为 API 设置一个项目,我不知道是谁制作了 PSR-7 并将响应对象标记为不可变,我看不出有任何用处(恕我直言。请解释一下如果我错了)。苗条的时候事情要容易得多 2。现在我在很长一段时间后又恢复苗条了。

我有一个发布方法的路线,我正在获取数据并将其保存到数据库中,并且我正在尝试发送 201 作为响应代码。所有示例和文档都向您展示了如何更改 index.php 文件本身中的响应代码,但我试图从响应构建器中更改它,我尝试使用工厂模式来提供不同的响应。问题是无论我从响应构建器类调用什么函数,响应代码始终保持 200。我尝试了许多论坛和不同的瘦身方式,但仍然无法做到这一点。我几乎决定放弃 PSR 7 路由器实施并实施我自己的路由解决方案。但我记得不要重新发明轮子,所以我来到这里作为最后的尝试。下面是代码。

路线定义

控制器方法(抽象我只是设置它)

JSON 构建器

谁能指出我正确的方向?

0 投票
1 回答
1623 浏览

php - PHPmailer 的 Slim 框架和电子邮件模板呈现问题

我正在使用 Slim v3 php 框架并集成了 PHPMailer 来发送邮件。我不使用任何像 Twig 这样的模板引擎,但我宁愿使用普通的 PHP。

我的想法是在一个单独的文件中为电子邮件制作一个 HTML5 模板,类似于常规页面模板,然后将一些变量传递给它,呈现并发送它。除了一部分之外,这一切都很好 - 渲染的输出也具有渲染的标题信息。

这就是我的代码的样子,当然简化了

然后我用 PHPMailer 发送这个

问题是,在 HTML 内容之上,我得到了这个标题数据,它在发送的电子邮件中可见:

没有这个有没有办法渲染输出?目前我正在使用 str_replace() 来删除它,但我想有一个优雅的内置解决方案来处理这个问题?

0 投票
1 回答
520 浏览

php - 如何实施 PSR-7?

我已经阅读了 PSR-7,但我根本无法理解如何实现它。这是我不明白的一个例子:

withHeader方法会调用一个header()函数吗?如果是这样,我该如何实现该withoutHeader方法?如果那不是打电话的时间和地点header(),它在哪里(和何时)?

谢谢大家。

0 投票
0 回答
222 浏览

php - 使用 Dice - Zend Diactoros 和 Fast Route 的依赖注入器

我在一个小项目中使用 Dice(一个不错的 Dependency Injector)。我还在使用 PSR7 Zend Diactoros 来处理请求和 nikic 快速路由。

我使用文档中的示例让 Dice 为 Twig、DB 和我的所有其他类工作,但我无法弄清楚如何使用它将 Request $request 传递给我的控制器。

如果您至少可以为我指出如何正确使用依赖注入器来处理此类用例,我将不胜感激

控制器代码:

应用程序初始化代码:

在路由器代码中:

其中 $this->app->di 是 Dice 而 $handler 是

1因为我的路由没有参数第一个错误是我传递给几个参数,所以我尝试在路由器中执行此操作,它调用控制器的索引方法并传递 $request

2现在我通过了我的参数,但错误是

我有一种感觉,我使用这一切都错了,也许 Di 需要创建,$midEngine因为现在我自己创建了一个响应和请求对象。

任何建议都会很好,我正试图围绕一个迷你框架应该如何围绕一个 Di 旋转。

谢谢,亚历克斯

0 投票
1 回答
90 浏览

php - PSR-7 UriInterface - 具有百分比编码的无效组件

我一直在研究PSR-7 UriInterface的实现,关于实现何时应该为某些组件抛出 InvalidArgumentException 的规范有点令人费解。

例如,UriInterface::withPath 指定在给定无效路径的情况下抛出这样的异常,但相同的文档块指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码”。

负责管理编码的实现在整个规范的其余部分都得到了证实。

由于实现确保了正确的编码,因此实现的用户似乎可以将任意数量的无效字符传递到 withPath 之类的函数中,然后该函数将被正确编码而不是触发异常。

我能想到的唯一可以保证 InvalidArgumentException 的情况是,如果 withPath 传递了一个非字符串(不管它的价值如何,这似乎是Guzzle 对规范的解释)。

真正严格阅读PHP 对 InvalidArgumentException 的简要介绍似乎可以避免这种“严格类型”解释,但我不禁想知道 PHP-FIG 是否还有其他想法,特别是考虑到 URI 语法的复杂性一般来说。

如果 UriInterface 方法(如 withPath)传递了一个字符串,是否存在任何情况下应该抛出异常?

0 投票
1 回答
688 浏览

php - Flysystem S3远程文件下载总是损坏

我最近开始在现有应用程序中使用 Flysystem,目的是抽象本地和远程(特别是 S3)文件系统。在我成功配置 LocalAdapter 的开发环境中一切正常。但是,我无法让 S3 文件下载工作。我想指出文件上传工作正常,因为我可以通过手动浏览 AWS 管理控制台中的 S3 存储桶来成功下载文件。话虽如此,我将跳过初始化$filesystem变量的代码。

我的应用程序使用 PSR-7 方法。也就是说,下面的代码在一个函数内部,该函数将一个类型的对象Psr\Http\Message\ServerRequestInterface作为第一个参数传递,将一个类型的对象作为第二个参数传递Psr\Http\Message\ResponseInterface。鉴于本地文件系统工作正常,我认为可以安全地假设问题不存在。

这是代码:

当我转储$stream变量和$filesize变量时,结果符合预期。远程文件内容打印成功。但是,文件下载始终损坏,文件大小始终为 0 字节。

我假设 Flysystem 会在幕后处理所有事情,并且我不必先手动将文件下载到临时文件夹,然后再将其提供给客户端。

任何线索可能是什么问题?

更新 1

我也尝试过使用以下代码,但没有任何运气。但是,它继续在本地工作: