2018-08-07 03:18:22 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Engelsystem\Middleware;
|
|
|
|
|
|
|
|
use Engelsystem\Application;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
use LogicException;
|
|
|
|
use Psr\Http\Message\ResponseInterface;
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
|
|
use Psr\Http\Server\MiddlewareInterface;
|
|
|
|
use Psr\Http\Server\RequestHandlerInterface;
|
|
|
|
|
|
|
|
class Dispatcher implements MiddlewareInterface, RequestHandlerInterface
|
|
|
|
{
|
2018-08-25 21:16:20 +02:00
|
|
|
use ResolvesMiddlewareTrait;
|
|
|
|
|
2018-08-11 23:46:28 +02:00
|
|
|
/** @var MiddlewareInterface[]|string[] */
|
2022-12-15 19:50:56 +01:00
|
|
|
protected array $stack;
|
2018-08-07 03:18:22 +02:00
|
|
|
|
2022-12-15 19:50:56 +01:00
|
|
|
protected RequestHandlerInterface $next;
|
2018-08-07 03:18:22 +02:00
|
|
|
|
|
|
|
/**
|
2018-08-11 23:46:28 +02:00
|
|
|
* @param MiddlewareInterface[]|string[] $stack
|
2018-08-07 03:18:22 +02:00
|
|
|
*/
|
2022-12-15 19:50:56 +01:00
|
|
|
public function __construct(array $stack = [], protected ?Application $container = null)
|
2018-08-07 03:18:22 +02:00
|
|
|
{
|
|
|
|
$this->stack = $stack;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process an incoming server request and return a response, optionally delegating
|
|
|
|
* response creation to a handler.
|
|
|
|
*
|
|
|
|
* Could be used to group middleware
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public function process(
|
|
|
|
ServerRequestInterface $request,
|
|
|
|
RequestHandlerInterface $handler
|
|
|
|
): ResponseInterface {
|
|
|
|
$this->next = $handler;
|
|
|
|
|
|
|
|
return $this->handle($request);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle the request and return a response.
|
|
|
|
*
|
|
|
|
* It calls all configured middleware and handles their response
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
public function handle(ServerRequestInterface $request): ResponseInterface
|
|
|
|
{
|
|
|
|
$middleware = array_shift($this->stack);
|
|
|
|
|
|
|
|
if (!$middleware) {
|
|
|
|
if ($this->next) {
|
|
|
|
return $this->next->handle($request);
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new LogicException('Middleware queue is empty');
|
|
|
|
}
|
|
|
|
|
2018-08-25 21:16:20 +02:00
|
|
|
$middleware = $this->resolveMiddleware($middleware);
|
2018-08-07 03:18:22 +02:00
|
|
|
if (!$middleware instanceof MiddlewareInterface) {
|
|
|
|
throw new InvalidArgumentException('Middleware is no instance of ' . MiddlewareInterface::class);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $middleware->process($request, $this);
|
|
|
|
}
|
|
|
|
|
2022-12-14 19:15:20 +01:00
|
|
|
public function setContainer(Application $container): void
|
2018-08-07 03:18:22 +02:00
|
|
|
{
|
|
|
|
$this->container = $container;
|
|
|
|
}
|
|
|
|
}
|