MiddlewarePipe::add()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 6
ccs 4
cts 4
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
crap 2
1
<?php declare(strict_types=1);
2
3
namespace Igni\Network\Http\Middleware;
4
5
use Igni\Network\Exception\MiddlewareException;
6
use Psr\Http\Message\ResponseInterface;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Psr\Http\Server\MiddlewareInterface;
9
use Psr\Http\Server\RequestHandlerInterface;
10
use SplQueue;
11
12
/**
13
 * Variation of zend stratigility's pipe.
14
 */
15
class MiddlewarePipe implements MiddlewareInterface, RequestHandlerInterface
16
{
17
    protected $pipeline;
18
19 4
    public function __construct(SplQueue $pipeline = null)
20
    {
21 4
        $this->pipeline = $pipeline ?: new SplQueue();
22 4
    }
23
24 1
    public function __clone()
25
    {
26 1
        $this->pipeline = clone $this->pipeline;
27 1
    }
28
29 2
    public function __invoke(ServerRequestInterface $request): ResponseInterface
30
    {
31 2
        return $this->handle($request);
32
    }
33
34
    /**
35
     * De-queues and executes middleware from the top of the cloned pipeline.
36
     *
37
     * @param ServerRequestInterface $request
38
     * @return ResponseInterface
39
     */
40 2
    public function handle(ServerRequestInterface $request): ResponseInterface
41
    {
42 2
        if ($this->pipeline->isEmpty()) {
43 1
            throw MiddlewareException::forEmptyMiddlewarePipeline();
44
        }
45
46 1
        $pipeline = clone $this;
47 1
        $middleware = $pipeline->pipeline->dequeue();
48
49 1
        return $middleware->process($request, $pipeline);
50
    }
51
52
    /**
53
     * PSR-15 Middleware invocation
54
     *
55
     * @param ServerRequestInterface $request
56
     * @param RequestHandlerInterface $handler
57
     * @return ResponseInterface
58
     */
59 1
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
60
    {
61 1
        $next = new Next($this->pipeline, $handler);
62
63 1
        return $next($request);
64
    }
65
66
    /**
67
     * Attach middleware to the pipeline.
68
     *
69
     * @param MiddlewareInterface|callable ...$middleware
70
     */
71 1
    public function add(MiddlewareInterface ...$middleware): void
72
    {
73 1
        foreach ($middleware as $item) {
74 1
            $this->pipeline->enqueue($item);
75
        }
76 1
    }
77
}
78