juliangut/negotiate

协商中间件

2.1 2024-03-10 21:18 UTC

This package is auto-updated.

Last update: 2024-09-10 22:28:09 UTC


README

PHP version Latest Version License

Total Downloads Monthly Downloads

Negotiate

使用 willdurand/negotiation 的简单灵活的协商中间件

安装

Composer

composer require juliangut/negotiate

使用方法

需要 composer 自动加载文件

require './vendor/autoload.php';

use Jgut\Negotiate\Negotiator;
use Jgut\Negotiate\Scope\Language;
use Jgut\Negotiate\Scope\MediaType;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

$scopes = [
    new MediaType(['text/html', 'application/json'], 'text/html'),
    new Language(['en', 'es']),
];
/* @var \Psr\Http\Message\ResponseFactoryInterface $responseFactory */

$middleware = new Negotiator($scopes, $responseFactory);
$middleware->setAttributeName('negotiationProvider');

// Request handler
new class () implements RequestHandlerInterface {
    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $negotiationProvider = $request->getAttribute('negotiationProvider');

        $negotiationProvider->get('Accept-Language'); // \Negotiation\Accept
        $negotiationProvider->getAcceptLanguage(); // \Negotiation\AcceptLanguage
        $negotiationProvider->getAcceptLanguageLine(); // Negotiated language string
        $negotiationProvider->getAcceptCharset(); // null, not defined
        
        // ...
    }
};

作用域

将协商封装在上下文中,例如媒体类型或字符集。提供优先级列表,即可使用

可选的第二个参数控制当请求头为空或协商无法成功确定时的行为。如果设置,则将用于创建一个 \Negotiation\AcceptHeader,否则将抛出一个 \Jgut\Negotiation\NegotiatorException 并由中间件捕获

中间件

中间件需要一个协商作用域列表。协商将在中间件中发生

  • 如果一切顺利,请求将具有
    • 协商结果覆盖每个作用域的头部
    • 包含整个协商结果的对象的属性 \Jgut\Negotiate\Provider
  • 如果协商失败
    • 如果内容类型头部协商失败,将返回一个 415 响应
    • 如果其他协商失败,将返回一个 406 响应

从 1.x 迁移

  • 最低要求的 PHP 版本是 PHP 8.0
  • 如果需要,应在每个构造函数中指定作用域的默认值
  • 作用域的 negotiateRequest 现在返回修改后的请求(内部更改)

贡献

发现了一个错误或有一个功能请求?请 创建一个新问题。在创建之前先查看现有的问题。

请参阅文件 CONTRIBUTING.md

许可

有关许可条款的副本,请参阅包含在源代码中的文件 LICENSE