MiddlewareRunner   A
last analyzed

Complexity

Total Complexity 2

Size/Duplication

Total Lines 37
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 14
dl 0
loc 37
rs 10
c 1
b 0
f 0
wmc 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A run() 0 15 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Kafkiansky\SymfonyMiddleware\Middleware;
6
7
use Psr\Http\Message\ResponseInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Psr\Http\Server\MiddlewareInterface;
10
use Psr\Http\Server\RequestHandlerInterface;
11
use Symfony\Component\HttpFoundation\Response;
12
use Kafkiansky\SymfonyMiddleware\Psr\PsrResponseTransformer;
13
14
final class MiddlewareRunner
15
{
16
    /**
17
     * @var MiddlewareInterface[]
18
     */
19
    private array $middlewares;
20
    private RequestHandlerInterface $requestHandler;
21
    private PsrResponseTransformer $psrResponseTransformer;
22
23
    /**
24
     * @param MiddlewareInterface[] $middlewares
25
     */
26
    public function __construct(
27
        array $middlewares,
28
        RequestHandlerInterface $requestHandler,
29
        PsrResponseTransformer $psrResponseTransformer,
30
    ) {
31
        $this->middlewares = $middlewares;
32
        $this->requestHandler = $requestHandler;
33
        $this->psrResponseTransformer = $psrResponseTransformer;
34
    }
35
36
    public function run(ServerRequestInterface $serverRequest): Response
37
    {
38
        /** @var \Closure(ServerRequestInterface): ResponseInterface */
39
        $processor = array_reduce(
40
            array_reverse($this->middlewares),
41
            /** @param \Closure(ServerRequestInterface): ResponseInterface $stack */
42
            function (\Closure $stack, MiddlewareInterface $middleware): \Closure {
43
                return function (ServerRequestInterface $request) use ($middleware, $stack): ResponseInterface {
44
                    return $middleware->process($request, new StackMiddleware($stack));
45
                };
46
            },
47
            fn (ServerRequestInterface $request): ResponseInterface => $this->requestHandler->handle($request),
48
        );
49
50
        return $this->psrResponseTransformer->fromPsrResponse($processor($serverRequest));
51
    }
52
}
53