for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
declare(strict_types=1);
namespace Northwoods\Broker;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface as Middleware;
use Psr\Http\Server\RequestHandlerInterface as Handler;
class RequestHandler implements Handler
{
/** @var array */
private $middleware;
/** @var Handler */
private $nextRequestHandler;
/** @var MiddlewareResolver */
private $resolver;
/** @var int */
private $index = 0;
public function __construct(array $middleware, Handler $nextRequestHandler, MiddlewareResolver $resolver)
$this->middleware = $middleware;
$this->nextRequestHandler = $nextRequestHandler;
$this->resolver = $resolver;
}
public function handle(Request $request): Response
if (empty($this->middleware[$this->index])) {
return $this->nextRequestHandler->handle($request);
/** @var callable */
$condition = $this->middleware[$this->index][0];
/** @var Middleware|string */
$middleware = $this->middleware[$this->index][1];
$handler = $this->nextRequestHandler();
if ($condition($request)) {
return $this->resolver->resolve($middleware)->process($request, $handler);
} else {
return $handler->handle($request);
private function nextRequestHandler(): Handler
$copy = clone $this;
$copy->index++;
return $copy;