rszrama / negotiation-middleware
PHP应用程序使用的请求、响应和下一个可调用签名的内容协商中间件。
Requires
- php: >=5.4.0
- psr/http-message: 1.0
- willdurand/negotiation: 2.0.0-alpha1
This package is auto-updated.
Last update: 2024-08-24 22:26:40 UTC
README
NegotiationMiddleware 为 PHP 应用程序提供内容协商中间件,它使用中间件签名,该签名需要一个请求对象、一个响应对象以及中间件堆栈中的下一个可调用对象。
此库依赖于 willdurand/negotation 进行内容协商。它允许您将协商添加到中间件堆栈中,该堆栈
- 识别和匹配一组可接受的媒体类型。
- 在没有 Accept 请求头的情况下提供默认媒体类型。
- 丰富请求对象以包含协商后的媒体类型。
如果协商者无法确定响应请求应使用哪种媒体类型,它将返回一个带有 406 Not Acceptable 状态的响应。
安装
使用 Composer 安装 NegotiationMiddleware
$ composer require rszrama/negotiation-middleware
这将安装库及其依赖项。NegotiationMiddleware 需要 PHP 5.4.0 或更高版本。
用法
将 NegotiationMiddleware\Negotiator 实例添加到应用程序或路由级别的中间件堆栈中,传递两个参数给构造函数:一个要匹配的可接受媒体类型数组,以及一个布尔值,表示中间件是否应该在没有请求头中的 Accept 头的情况下仅匹配第一个可接受的媒体类型。
来自 Slim 3.x 的示例
<?php require 'vendor/autoload.php'; use \NegotiationMiddleware\Negotiator; $app = new \Slim\App(); $app ->get('/hello', function(Slim\Http\Request $request, Slim\Http\Response $response, $args) { return $response->write('Hello, world!'); }) ->add(new Negotiator(['text/html', 'application/json'], TRUE)); $app->run();
在这种情况下,来自网络浏览器的对 /hello 的请求很可能匹配此路由(/hello)指定的可接受媒体类型(text/html),因为我们的响应不是有效的 JSON。然而,如果服务器收到了没有 Accept 头的请求,它仍然会匹配到 text/html,因为我们指示对象提供默认媒体类型。
请注意,Slim\Http\Request 对象实现了 PSR-7 的 ServerRequestInterface。Negotiator::__invoke() 需要此接口的实例,以便在请求对象中存储协商后的媒体类型,使用名为 mediaType 的属性。
因此,路由闭包可以像这样打印协商后的媒体类型
$app ->get('/hello', function(Slim\Http\Request $request, Slim\Http\Response $response, $args) { $mediaType = $request->getAttribute('mediaType')->getValue(); return $response->write($mediaType); }) ->add(new Negotiator(['text/html', 'application/json'], TRUE));
mediaType 属性是 \Negotiation\Accept 的实例,它包含用于检查请求头中实际匹配的媒体类型的各种方法。有关更多信息,请参阅 [willdurand/negotiation] 的类文档 (https://github.com/willdurand/Negotiation)。
中间件签名
NegotiationMiddleware 使用由 Slim 3.x 需要的中间件签名,即接受三个参数的可调用对象:PSR-7 请求对象、PSR-7 响应对象以及表示堆栈中下一个中间件的可调用对象。
此模式和它的有用性得益于 PSR-7 的采用,这在 Matthew O'Phinney 的有帮助的 [博客文章] (https://mwop.net/blog/2015-01-08-on-http-middleware-and-psr-7.html) 中有所讨论,包括一个类似的示例
<?php use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; class Middleware { public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) { // Execute code before calling the next middleware. $next($request, $response); // Execute code after calling the next middleware. return $response; } }
由于此实现不是针对 Slim(或任何其他框架)的特定实现,因此它可以被任何使用相同中间件签名或可以修改以与使用 PSR-7 请求和响应对象的中间件模式兼容的应用程序重用。
许可证
NegotiationMiddleware 使用 MIT 许可证。有关更多信息,请参阅 LICENSE。