rszrama/negotiation-middleware

PHP应用程序使用的请求、响应和下一个可调用签名的内容协商中间件。

dev-master 2016-01-24 04:37 UTC

This package is auto-updated.

Last update: 2024-08-24 22:26:40 UTC


README

NegotiationMiddleware 为 PHP 应用程序提供内容协商中间件,它使用中间件签名,该签名需要一个请求对象、一个响应对象以及中间件堆栈中的下一个可调用对象。

此库依赖于 willdurand/negotation 进行内容协商。它允许您将协商添加到中间件堆栈中,该堆栈

  1. 识别和匹配一组可接受的媒体类型。
  2. 在没有 Accept 请求头的情况下提供默认媒体类型。
  3. 丰富请求对象以包含协商后的媒体类型。

如果协商者无法确定响应请求应使用哪种媒体类型,它将返回一个带有 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