MiddlewareDispatcher   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 4
eloc 13
c 1
b 0
f 0
dl 0
loc 47
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A withoutMiddleware() 0 10 1
A __construct() 0 4 1
A handle() 0 7 2
1
<?php
2
3
namespace Tleckie\Router;
4
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Server\MiddlewareInterface;
8
use Psr\Http\Server\RequestHandlerInterface;
9
use function array_filter;
10
use function array_shift;
11
12
/**
13
 * Class MiddlewareDispatcher
14
 *
15
 * @package Tleckie\Router
16
 * @author  Teodoro Leckie Westberg <[email protected]>
17
 */
18
class MiddlewareDispatcher implements RequestHandlerInterface
19
{
20
    /** @var MiddlewareInterface[] */
21
    private array $middlewares;
22
23
    /** @var ResponseInterface */
24
    private ResponseInterface $response;
25
26
    /**
27
     * MiddlewareDispatcher constructor.
28
     *
29
     * @param ResponseInterface   $response
30
     * @param MiddlewareInterface ...$middlewares
31
     */
32
    public function __construct(ResponseInterface $response, MiddlewareInterface ...$middlewares)
33
    {
34
        $this->response = $response;
35
        $this->middlewares = $middlewares;
36
    }
37
38
    /**
39
     * @param ServerRequestInterface $request
40
     * @return ResponseInterface
41
     */
42
    public function handle(ServerRequestInterface $request): ResponseInterface
43
    {
44
        $middleware = array_shift($this->middlewares);
45
46
        return $middleware
47
            ? $middleware->process($request, $this->withoutMiddleware($middleware))
48
            : $this->response;
49
    }
50
51
    /**
52
     * @param MiddlewareInterface $middleware
53
     * @return RequestHandlerInterface
54
     */
55
    private function withoutMiddleware(MiddlewareInterface $middleware): RequestHandlerInterface
56
    {
57
        $collection = array_filter(
58
            $this->middlewares,
59
            static function ($current) use ($middleware) {
60
                return $middleware !== $current;
61
            }
62
        );
63
64
        return new self($this->response, ...$collection);
65
    }
66
}
67