Passed
Push — master ( 41250d...a8c584 )
by Hong
01:27
created

Queue::fixHandler()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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