2017 © Pedro Peláez
 

library negotiate

Negotiation middleware

image

juliangut/negotiate

Negotiation middleware

  • Sunday, September 10, 2017
  • by juliangut
  • Repository
  • 1 Watchers
  • 0 Stars
  • 58 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 0 Forks
  • 0 Open issues
  • 3 Versions
  • 4 % Grown

The README.md

PHP version Latest Version License, (*1)

Total Downloads Monthly Downloads, (*2)

Negotiate

Simple and flexible negotiation middleware using willdurand/negotiation, (*3)

Installation

Composer

composer require juliangut/negotiate

Usage

Require composer autoload file, (*4)

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

        // ...
    }
};

Scopes

Encapsulate negotiation in a context, for example media type or character set. Give it a list of priorities, and you are good to go, (*5)

An optional second parameter controls behaviour if request header is empty or negotiation could not be determined successfully. If set, it will be used to create a \Negotiation\AcceptHeader, A \Jgut\Negotiation\NegotiatorException will be thrown and captured by the middleware otherwise, (*6)

Middleware

Middleware requires a list of negotiation scopes. Negotiation will take place in the middleware, (*7)

  • If everything goes well request will have
    • Headers of each scope overridden with negotiation result
    • An attribute with a \Jgut\Negotiate\Provider object with the result of the whole negotiation
  • If negotiation goes south
    • A 415 response will be returned if Content-Type header negotiation fails
    • A 406 response will be returned if any other negotiation fails

Migration from 1.x

  • PHP minimum required version is PHP 8.0
  • Scope's default should be specified in each constructor should it be needed
  • Scope's negotiateRequest now returns modified request (internal change)

Contributing

Found a bug or have a feature request? Please open a new issue. Have a look at existing issues before., (*8)

See file CONTRIBUTING.md, (*9)

License

See file LICENSE included with the source code for a copy of the license terms., (*10)

The Versions