Router::addRoute()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
c 1
b 0
f 0
dl 0
loc 7
rs 10
cc 1
nc 1
nop 4
1
<?php
2
3
/**
4
 * @author    : Jagepard <[email protected]">
5
 * @license   https://mit-license.org/ MIT
6
 */
7
8
namespace Primate\Router;
9
10
class Router
11
{
12
    private array $routes;
13
14
    /**
15
     * Adds a route
16
     * ------------
17
     * Добавляет маршрут
18
     *
19
     * @param  string         $uri
20
     * @param  array|callable $target
21
     * @param  string         $requestMethod
22
     * @param  string|null    $name
23
     * @return void
24
     */
25
    public function addRoute(string $uri, array|callable $target, string $requestMethod = "GET", string $name = null): void
26
    {
27
        $this->routes[] = [
28
            "URI" => $uri,
29
            "REQUEST_METHOD" => $requestMethod,
30
            "TARGET" => $target,
31
            "ROUTE_NAME" => $name
32
        ];
33
    }
34
35
    /**
36
     * Matches a request with a route
37
     * ------------------------------
38
     * Сопоставляет запрос с маршрутом
39
     *
40
     * @param  array $requestUri
41
     * @return void
42
     */
43
    public function matchRoute(array $requestUri): void
44
    {
45
        foreach ($this->routes as $route) {
46
            if ($route["REQUEST_METHOD"] === $_SERVER["REQUEST_METHOD"]) {
47
                $routeUri = explode('/', trim($route["URI"], '/'));
48
                $count = count($routeUri);
49
                $uri = [];
50
                $params = null;
51
52
                for ($i = 0; $i < $count; $i++) {
53
                    // Looking for a match with a pattern {...}
54
                    if (preg_match('/{([a-zA-Z0-9_]*?)}/', $routeUri[$i]) !== 0) {
55
                        if (array_key_exists($i, $requestUri)) {
56
                            $uri[] = $requestUri[$i];
57
                            $params[] = $requestUri[$i];
58
                        }
59
60
                        continue;
61
                    }
62
63
                    $uri[] = $routeUri[$i];
64
                }
65
66
                if ($requestUri === $uri) {
67
                    if ($route["TARGET"] instanceof \Closure) {
68
                        (is_array($params)) ? $route["TARGET"](...$params) : $route["TARGET"]($params);
69
                        return;
70
                    }
71
72
                    $this->callAction($params, $route["TARGET"][1], new $route["TARGET"][0]);
73
                    return;
74
                }
75
            }
76
        }
77
78
        http_response_code(404);
79
    }
80
81
    /**
82
     * Calls the required controller method
83
     * ------------------------------------
84
     * Вызывает необходимый метод контроллера
85
     *
86
     * @param  $params
87
     * @param  $action
88
     * @param  $controller
89
     * @return void
90
     */
91
    protected function callAction($params, $action, $controller): void
92
    {
93
        if (!isset($params)) {
94
            $controller->{$action}();
95
        } else {
96
            if (!in_array("", $params)) {
97
                $controller->{$action}(...$params);
98
            }
99
        }
100
    }
101
}
102