Queue::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
c 2
b 0
f 0
nc 2
nop 1
dl 0
loc 6
rs 10
1
<?php
2
3
/**
4
 * Phoole (PHP7.2+)
5
 *
6
 * @category  Library
7
 * @package   Phoole\Middleware
8
 * @copyright Copyright (c) 2019 Hong Zhang
9
 */
10
declare(strict_types=1);
11
12
namespace Phoole\Middleware;
13
14
use Psr\Http\Message\ResponseInterface;
15
use Psr\Http\Server\MiddlewareInterface;
16
use Psr\Http\Server\RequestHandlerInterface;
17
use Psr\Http\Message\ServerRequestInterface;
18
19
/**
20
 * Runnable queue of middlewares
21
 *
22
 * ```php
23
 * // init the queue with default handler(callable or RequestHandlerInterface)
24
 * $queue = new Queue(new Response(404));
25
 *
26
 * // add middlewares
27
 * $queue->add(
28
 *     new SessionMiddleware(), // object
29
 *     function($request, $handler) { // callable
30
 *         $response = $handler->handle($request);
31
 *         $response->withStatusCode(301);
32
 *         return $response;
33
 *     },
34
 * );
35
 * // run the queue
36
 * $queue->handle($request);
37
 * ```
38
 *
39
 * @package Phoole\Middleware
40
 */
41
class Queue implements RequestHandlerInterface, MiddlewareInterface
42
{
43
    /**
44
     * queue of the middlewares or callables
45
     *
46
     * @var  MiddlewareInterface[]|callable[]
47
     */
48
    protected $middlewares = [];
49
50
    /**
51
     * default handler
52
     *
53
     * @var  RequestHandlerInterface|callable
54
     */
55
    protected $defaultHandler;
56
57
    /**
58
     * Constructor
59
     *
60
     * @param  ResponseInterface $defaultResponse
61
     */
62
    public function __construct(?ResponseInterface $defaultResponse = NULL)
63
    {
64
        if (!is_null($defaultResponse)) {
65
            $this->defaultHandler =
66
                function(ServerRequestInterface $request) use ($defaultResponse) {
67
                    return $defaultResponse;
68
                };
69
        }
70
    }
71
72
    /**
73
     * add middleware[s] to the queue
74
     *
75
     * @param  MiddlewareInterface|callable ...$middlewares
76
     * @return $this
77
     */
78
    public function add(...$middlewares)
79
    {
80
        foreach ($middlewares as $m) {
81
            $this->middlewares[] = $m;
82
        }
83
        return $this;
84
    }
85
86
    /**
87
     * {@inheritDoc}
88
     */
89
    public function process(
90
        ServerRequestInterface $request,
91
        RequestHandlerInterface $handler
92
    ): ResponseInterface {
93
        $this->defaultHandler = $handler;
94
        return $this->handle($request);
95
    }
96
97
    /**
98
     * {@inheritDoc}
99
     *
100
     * @throws \LogicException if default handler not set
101
     */
102
    public function handle(ServerRequestInterface $request): ResponseInterface
103
    {
104
        $handler = $this->fixHandler($this->defaultHandler);
105
        foreach (array_reverse($this->middlewares) as $middleware) {
106
            $handler = new Handler($handler, $middleware);
107
        }
108
        return $handler->handle($request);
109
    }
110
111
    /**
112
     * convert to standard RequestHandlerInterface
113
     *
114
     * @param  RequestHandlerInterface|callable|null $handler
115
     * @return RequestHandlerInterface
116
     * @throws \LogicException
117
     */
118
    protected function fixHandler($handler): RequestHandlerInterface
119
    {
120
        if ($handler instanceof RequestHandlerInterface) {
121
            return $handler;
122
        }
123
124
        if (is_callable($handler)) {
125
            return new Handler($handler);
126
        }
127
128
        throw new \LogicException('unknown type of default handler');
129
    }
130
}