diff options
Diffstat (limited to 'src/Middleware/MiddlewarePipeline.php')
| -rw-r--r-- | src/Middleware/MiddlewarePipeline.php | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/Middleware/MiddlewarePipeline.php b/src/Middleware/MiddlewarePipeline.php new file mode 100644 index 0000000..65a300e --- /dev/null +++ b/src/Middleware/MiddlewarePipeline.php @@ -0,0 +1,35 @@ +<?php + +declare(strict_types=1); + +namespace BrettParson\MiniRoute\Middleware; + +use BrettParson\MiniRoute\Http\RequestInterface; +use BrettParson\MiniRoute\Http\ResponseInterface; + +final class MiddlewarePipeline +{ + /** + * Wrap a core handler with an ordered list of middleware instances. + * + * The first middleware in $middleware becomes the outermost layer, so a + * request flows through it first and its response post-processing runs + * last. + * + * @param list<MiddlewareInterface> $middleware + * @param callable(RequestInterface): ResponseInterface $core + * @return callable(RequestInterface): ResponseInterface + */ + public static function compose(array $middleware, callable $core): callable + { + foreach (array_reverse($middleware) as $middlewareInstance) { + $next = $core; + + $core = static function (RequestInterface $request) use ($middlewareInstance, $next): ResponseInterface { + return $middlewareInstance->handle($request, $next); + }; + } + + return $core; + } +} |
