diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/AbstractStrategy.php | 32 | ||||
| -rw-r--r-- | src/BasicStrategy.php | 3 | ||||
| -rw-r--r-- | src/Contracts/Middleware.php | 16 | ||||
| -rw-r--r-- | src/Contracts/Strategy.php | 10 |
4 files changed, 59 insertions, 2 deletions
diff --git a/src/AbstractStrategy.php b/src/AbstractStrategy.php new file mode 100644 index 0000000..54b78c1 --- /dev/null +++ b/src/AbstractStrategy.php @@ -0,0 +1,32 @@ +<?php + +declare(strict_types=1); + +namespace Lightscale\Router; + +use Lightscale\Router\Contracts\Middleware; +use Lightscale\Router\Contracts\Strategy; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; + +abstract class AbstractStrategy implements Strategy +{ + /** + * @param Middleware[] $middlewares + * @param callable(RequestInterface): ResponseInterface $handler + */ + public function runMiddleware( + RequestInterface $request, + array $middlewares, + callable $handler, + ): ResponseInterface { + $handler = count($middlewares) > 0 ? array_reduce( + array_reverse($middlewares), + fn (callable $handler, Middleware $middleware) => fn (ServerRequestInterface $request) => $middleware->handle($request, $handler), + $handler + ) : $handler; + + return $handler($request); + } +} diff --git a/src/BasicStrategy.php b/src/BasicStrategy.php index 5043576..d2ee91a 100644 --- a/src/BasicStrategy.php +++ b/src/BasicStrategy.php @@ -4,13 +4,12 @@ declare(strict_types=1); namespace Lightscale\Router; -use Lightscale\Router\Contracts\Strategy; use Lightscale\Router\Exceptions\InvalidResponseException; use Lightscale\Router\Exceptions\NotFoundException; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; -class BasicStrategy implements Strategy +class BasicStrategy extends AbstractStrategy { public function runRoute(RouteCall $call): ResponseInterface { diff --git a/src/Contracts/Middleware.php b/src/Contracts/Middleware.php new file mode 100644 index 0000000..96037c8 --- /dev/null +++ b/src/Contracts/Middleware.php @@ -0,0 +1,16 @@ +<?php + +declare(strict_types=1); + +namespace Lightscale\Router\Contracts; + +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; + +interface Middleware +{ + public function handle( + ServerRequestInterface $request, + callable $next, + ): ResponseInterface; +} diff --git a/src/Contracts/Strategy.php b/src/Contracts/Strategy.php index bb877c1..fa41819 100644 --- a/src/Contracts/Strategy.php +++ b/src/Contracts/Strategy.php @@ -10,6 +10,16 @@ use Psr\Http\Message\ResponseInterface; interface Strategy { + /** + * @param Middleware[] $middlewares + * @param callable(RequestInterface): ResponseInterface $handler + */ + public function runMiddleware( + RequestInterface $request, + array $middlewares, + callable $handler, + ): ResponseInterface; + public function runRoute(RouteCall $call): ResponseInterface; public function notFound(RequestInterface $request): ResponseInterface; |
