Runner::factory()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 3
Bugs 1 Features 1
Metric Value
c 3
b 1
f 1
dl 0
loc 8
ccs 6
cts 6
cp 1
rs 9.4285
cc 2
eloc 5
nc 2
nop 1
crap 2
1
<?php
2
3
namespace Sirius\Middleware;
4
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
8
class Runner
9
{
10
11
    /* @var runner */
12
    protected $next;
13
14
    protected $middleware;
15
16
    /**
17
     * Creates a runner based on an array of middleware
18
     *
19
     * @param array $middlewares
20
     * @return Runner
21
     */
22 1
    public static function factory(array $middlewares = array())
23
    {
24 1
        $runner = new static;
25 1
        foreach ($middlewares as $middleware) {
26 1
            $runner = $runner->add($middleware);
27 1
        }
28 1
        return $runner;
29
    }
30
31 4
    public function __construct(callable $middleware = null)
32
    {
33 4
        $this->middleware = $middleware;
34 4
    }
35
36
    /**
37
     * Returns a new instance of a runner (ie: immutable middleware runner)
38
     *
39
     * @param callable $middleware
40
     * @return Runner
41
     */
42 3
    public function add(callable $middleware)
43
    {
44 3
        $runner = new static($middleware);
45 3
        $runner->next = $this;
46
47 3
        return $runner;
48
    }
49
50
    /**
51
     * @param ServerRequestInterface $request
52
     * @param ResponseInterface $response
53
     * @return ResponseInterface
54
     */
55 4
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
56
    {
57 4
        if (!$this->middleware) {
58 3
            return $response;
59
        }
60
61 3
        $result = call_user_func($this->middleware, $request, $response, $this->next);
62 3
        if (!$result instanceof ResponseInterface) {
63 1
            $result = $response;
64 1
        }
65
66 3
        return $result;
67
    }
68
}
69