Completed
Push — master ( 180451...0a42e5 )
by Woody
11s
created

RequestHandler::nextRequestHandler()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 0
crap 1
1
<?php
2
3
namespace Northwoods\Broker;
4
5
use Interop\Http\Server\MiddlewareInterface;
6
use Interop\Http\Server\RequestHandlerInterface;
7
use Psr\Container\ContainerInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use SplObjectStorage;
10
11
class RequestHandler implements RequestHandlerInterface
12
{
13
    /**
14
     * @var array
15
     */
16
    private $middleware;
17
18
    /**
19
     * @var RequestHandlerInterface $nextRequestHandler
20
     */
21
    private $nextRequestHandler;
22
23
    /**
24
     * @var ContainerInterface
25
     */
26
    private $container;
27
28
    /**
29
     * @var int
30
     */
31
    private $index = 0;
32
33 4
    public function __construct(array $middleware, RequestHandlerInterface $nextRequestHandler, ContainerInterface $container = null)
34
    {
35 4
        $this->middleware = $middleware;
36 4
        $this->nextRequestHandler = $nextRequestHandler;
37 4
        $this->container = $container;
38 4
    }
39
40
    // RequestHandlerInterface
41 4
    public function handle(ServerRequestInterface $request)
42
    {
43 4
        if (empty($this->middleware[$this->index])) {
44 4
            return $this->nextRequestHandler->handle($request);
45
        }
46
47
        /** @var callable */
48 3
        $condition = $this->middleware[$this->index][0];
49
50
        /** @var MiddlewareInterface|string */
51 3
        $middleware = $this->middleware[$this->index][1];
52
53
        /** @var RequestHandlerInterface */
54 3
        $handler = $this->nextRequestHandler();
55
56 3
        if ($condition($request)) {
57 3
            return $this->resolveMiddleware($middleware)->process($request, $handler);
58
        } else {
59 1
            return $handler->handle($request);
60
        }
61
    }
62
63
    /**
64
     * @return RequestHandlerInterface
65
     */
66 3
    private function nextRequestHandler()
67
    {
68 3
        $copy = clone $this;
69 3
        $copy->index++;
70
71 3
        return $copy;
72
    }
73
74
    /**
75
     * @param string|MiddlewareInterface $middleware
76
     * @return MiddlewareInterface
77
     */
78 3
    private function resolveMiddleware($middleware)
79
    {
80 3
        if ($middleware instanceof MiddlewareInterface) {
81 2
            return $middleware;
82
        }
83
84 1
        return $this->container->get($middleware);
85
    }
86
}
87