Passed
Pull Request — master (#30)
by Nícollas
02:50
created

MiddlewareTrait::callMiddlewares()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 9
nc 3
nop 0
dl 0
loc 16
rs 9.9666
c 1
b 0
f 0
1
<?php
2
3
namespace CoffeeCode\Router;
4
5
trait MiddlewareTrait
6
{
7
    /** @var array */
8
    protected $middlewares = [];
9
10
    /** @var array */
11
    protected $currentRoute;
12
13
    /** @var array */
14
    protected $queue;
15
16
    /** @var int = 0 */
17
    protected $currentQueueNumber = 0;
18
19
    /**
20
     * @var array $middlewares
21
     * @return self
22
     */
23
    public function setMiddlewares(Array $middlewares)
24
    {
25
        $this->middlewares = $middlewares;
26
    }
27
28
    /** 
29
     * @return array 
30
     */
31
    protected function getCurrentMiddlewares()
32
    {
33
        if (!isset($this->currentRoute['middlewares'])) return;
34
35
        return $this->currentRoute['middlewares'];
36
    }
37
38
    /** 
39
     * @param array $route
40
     */
41
    protected function setCurrentRoute(Array $route): void
42
    {
43
        $this->currentRoute = $route;
44
    }
45
46
    /**
47
     * @return mixed|bool
48
     */
49
    protected function resolveMiddleware()
50
    {
51
        $middlewares = $this->currentRoute['middleware'];
52
53
        if (is_string($middlewares)) {
54
            $middlewares = explode(',', $middlewares);
55
        }
56
57
        $this->resolveNestedMiddleware($middlewares);
58
        
59
        return $this->callMiddlewares();
60
    }
61
62
    /**
63
     * @param array $middlewares
64
     */
65
    protected function resolveNestedMiddleware(Array $middlewares): void
66
    {
67
        $this->queue = array_map(function($middleware) {
68
            $middleware = trim(rtrim($middleware));
69
    
70
            return $this->instanceMiddleware($middleware);
71
        }, $middlewares);
72
    }
73
74
    /**
75
     * @param string $alias
76
     * @return null|string
77
     */
78
    public function getMiddlewareByAlias(String $alias)
79
    {
80
        if (!array_key_exists($alias, $this->middlewares)) {
81
            return;
82
        }
83
84
        if (class_exists($this->middlewares[$alias])) {
85
            return $this->middlewares[$alias];
86
        }
87
88
        return;
89
    }
90
91
    /**
92
     * @param string
93
     * @return null|object
94
     */
95
    protected function instanceMiddleware($middleware)
96
    {
97
        if (!preg_match("/\\\/", $middleware)) {
98
            if(!$middlewareClass = $this->getMiddlewareByAlias($middleware)) return;
99
100
            return new $middlewareClass();
101
        }
102
103
        if (class_exists($middleware)) {
104
            return new $middleware();
105
        }
106
107
        return;
108
    }
109
110
    /**
111
     * @return mixed|bool
112
     */
113
    protected function next()
114
    {
115
        $this->currentQueueNumber++;
116
117
        return $this->callMiddlewares();
118
    }
119
120
    /**
121
     * @return void
122
     */
123
    protected function reset()
124
    {
125
        $this->currentQueueNumber = 0;
126
    }
127
128
    /**
129
     * @return mixed|bool
130
     */
131
    protected function callMiddlewares()
132
    {
133
        if (!isset($this->queue[$this->currentQueueNumber])) {
134
            $this->reset();
135
            return true;
136
        }
137
138
        $currentMiddleware = $this->queue[$this->currentQueueNumber];
139
140
        if (is_null($currentMiddleware) || empty($currentMiddleware)) {
141
            return $this->next();
142
        }
143
144
        return $currentMiddleware->handle(
145
                $this->currentRoute['data'],
146
                fn() => $this->next()
147
            );
148
    }
149
}
150