aboutsummaryrefslogtreecommitdiff
path: root/src/Middleware/MiddlewarePipeline.php
blob: 65a300e1a891d49ef7e9569189d0ef63a9ed12fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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;
    }
}