Completed
Pull Request — master (#115)
by Phil
03:12
created

Runner::run()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
cc 2
eloc 4
nc 2
nop 3
crap 2
1
<?php
2
3
namespace League\Route\Middleware;
4
5
use Psr\Http\Message\ResponseInterface;
6
use Psr\Http\Message\ServerRequestInterface;
7
8
class Runner
9
{
10
    /**
11
     * @var callable[]
12
     */
13
    protected $before = [];
14
15
    /**
16
     * @var callable[]
17
     */
18
    protected $after = [];
19
20
    /**
21
     * @var callable[]
22
     */
23
    protected $queue = [];
24
25
    /**
26
     * Whether the queue has been built.
27
     *
28
     * @var boolean
29
     */
30
    protected $queued = false;
31
32
    /**
33
     * Build and invoke a stack of middleware around a specific middleware.
34
     *
35
     * @param callable                                 $middleware
36
     * @param \Psr\Http\Message\ServerRequestInterface $request
37
     * @param \Psr\Http\Message\ResponseInterface      $response
38
     *
39
     * @return \Psr\Http\Message\ResponseInterface
40
     */
41 15
    public function run(callable $middleware, ServerRequestInterface $request, ResponseInterface $response)
42
    {
43 15
        if ($this->queued === false) {
44 15
            $this->buildQueue($middleware);
45 15
        }
46
47 15
        return $this->next($request, $response);
48
    }
49
50
    /**
51
     * Next callable to be passed throughout queue.
52
     *
53
     * @param \Psr\Http\Message\ServerRequestInterface $request
54
     * @param \Psr\Http\Message\ResponseInterface      $response
55
     *
56
     * @return \Psr\Http\Message\ResponseInterface
57
     */
58 15
    public function next(ServerRequestInterface $request, ResponseInterface $response)
59
    {
60 15
        if (empty($this->queue)) {
61 12
            return $response;
62
        }
63
64 15
        $middleware = array_shift($this->queue);
65 15
        return $middleware($request, $response, [$this, 'next']);
66
    }
67
68
    /**
69
     * Add a middleware to the before queue.
70
     *
71
     * @param callable $middleware
72
     *
73
     * @return self
74
     */
75
    public function before(callable $middleware)
76
    {
77
        $this->before[] = $middleware;
78
79
        return $this;
80
    }
81
82
    /**
83
     * Add a middleware to the after queue.
84
     *
85
     * @param callable $middleware
86
     *
87
     * @return self
88
     */
89
    public function after(callable $middleware)
90
    {
91
        $this->after[] = $middleware;
92
93
        return $this;
94
    }
95
96
    /**
97
     * Build the queue of middleware.
98
     *
99
     * @param callable $middleware
100
     *
101
     * @return void
102
     */
103 15
    protected function buildQueue(callable $middleware)
104
    {
105 15
        $this->queue   = $this->before;
106 15
        $this->queue[] = $middleware;
107 15
        $this->queue   = array_merge($this->queue, $this->after);
108
109 15
        $this->queued = true;
110 15
    }
111
}
112