This is an implementation of PSR-15 using the proposed Interface packages psr/http-server-middleware and psr/http-server-handler for PHP ^8.1 runtime environment.
It enables a sequential execution of middlewares that use a PSR-7 conform Response/Request implementation.
composer require idealo/php-middleware-stackNote: use Version ^2.0 for PHP < 8.1
useIdealo\Middleware\Stack;
$stack = newStack(
$defaultResponse,
$middleware1,
$middleware2,
$middleware3
);
$stackResponse = $stack->handle($request);idealo/php-middleware-stack provides the Idealo\Middleware\Stack class. All it has to know in order to be
instantiable is:
- an instance of
Psr\Http\Message\ResponseInterfaceas the default response - and middlewares, that implement the
Psr\Http\Server\MiddlewareInterface
To perform a sequential processing of injected middlewares you have to call stack's handle method with:
- an instance of
Psr\Http\Message\ServerRequestInterface.
By default stack's handle method returns the injected response object. If any middleware decides to answer on it's
own, than the response object of this certain middleware is returned.
Stack implements Psr\Http\Server\RequestHandlerInterface.
// you decide what middleware you want to put in a stack.usePsr\Http\Message\ResponseInterface;
usePsr\Http\Message\ServerRequestInterface;
usePsr\Http\Server\RequestHandlerInterface;
usePsr\Http\Server\MiddlewareInterface;
class TrickyMiddleware implements MiddlewareInterface
{
publicfunctionprocess(ServerRequestInterface$request, RequestHandlerInterface$handler) : ResponseInterface
{
$requestBody = $request->getBody();
try {
// implement your middleware logic here
} catch (\Exception$exception){
returnnewCustomExceptionResponse($exception);
}
return$handler->handle($request);
}
}
class VeryTrickyMiddleware implements MiddlewareInterface
{
...
}
class LessTrickyMiddleware implements MiddlewareInterface
{
...
}
// you define your PSR7 conform response instance$defaultResponse = newDefaultResponse();
// you put your request into a PSR7 conform way$request = newServerRequest();
// and here we are$stack = new \Idealo\Middleware\Stack(
$defaultResponse,
newTrickyMiddleware(),
newVeryTrickyMiddleware(),
newLessTrickyMiddleware()
);
$stackResponse = $stack->handle($request);
// if everything goes well thenvar_dump($stackResponse === $defaultResponse); // gives: true