MiddlewarePipe::append()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 4
c 0
b 0
f 0
ccs 3
cts 3
cp 1
rs 10
cc 1
nc 1
nop 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Lit\Nimo\Middlewares;
6
7
use Lit\Nimo\Handlers\PipeNextHandler;
8
use Psr\Http\Message\ResponseInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Psr\Http\Server\MiddlewareInterface;
11
12
/**
13
 * Pipe or chain of middlewares. This middleware is designed to run multiple middlewares one by one.
14
 */
15
class MiddlewarePipe extends AbstractMiddleware
16
{
17
    /**
18
     * @var MiddlewareInterface[]
19
     */
20
    protected $stack = [];
21
22
    /**
23
     * append $middleware
24
     * return $this
25
     * note this method would modify $this
26
     *
27
     * @param MiddlewareInterface $middleware The middleware to be append.
28
     * @return $this
29
     */
30 2
    public function append(MiddlewareInterface $middleware): MiddlewarePipe
31
    {
32 2
        $this->stack[] = $middleware;
33 2
        return $this;
34
    }
35
36
    /**
37
     * prepend $middleware
38
     * return $this
39
     * note this method would modify $this
40
     *
41
     * @param MiddlewareInterface $middleware The middleware to be prepend.
42
     * @return $this
43
     */
44 1
    public function prepend(MiddlewareInterface $middleware): MiddlewarePipe
45
    {
46 1
        array_unshift($this->stack, $middleware);
47 1
        return $this;
48
    }
49
50 4
    protected function main(): ResponseInterface
51
    {
52 4
        return $this->iterate($this->request, 0);
53
    }
54
55
    /**
56
     * This is a internal method for run one single iteration.
57
     *
58
     * @internal This is a public method for PipeNextHandler but NOT considered part of public API.
59
     *
60
     * @param ServerRequestInterface $request The request.
61
     * @param int                    $index   Current iteration index.
62
     * @return ResponseInterface
63
     */
64 4
    public function iterate(ServerRequestInterface $request, int $index): ResponseInterface
65
    {
66 4
        if (!isset($this->stack[$index])) {
67 4
            return $this->delegate($request);
68
        }
69
70 3
        return $this->stack[$index]->process($request, new PipeNextHandler($this, $index + 1));
71
    }
72
}
73