Passed
Branch master (7482d2)
by Henri
09:41 queued 08:07
created

Router::name()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 8
Bugs 0 Features 3
Metric Value
cc 1
eloc 6
nc 1
nop 1
dl 0
loc 8
rs 10
c 8
b 0
f 3
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace HnrAzevedo\Router;
6
7
use HnrAzevedo\Http\Uri;
8
9
final class Router implements RouterInterface
10
{
11
    use DefinitionsTrait, 
12
        RunInTrait, 
13
        CheckTrait, 
14
        OwnerTrait, 
15
        MiddlewareTrait, 
16
        WhereTrait,
17
        PrioritizeTrait,
18
        CurrentTrait;
19
20
    private array $groupsName = [];
21
    private ?\Exception $error = null;
22
23
    public static function name(string $name): Router
24
    {
25
        self::getInstance()->existRouteName($name);
26
        $route = self::getInstance()->inSave();
27
        $route['name'] = $name;
28
        self::getInstance()->routesName[$name] = $name;
29
        self::getInstance()->unsetRoute(array_key_last(self::getInstance()->getRoutes()))->updateRoute($route, $name);
30
        return self::getInstance();
31
    }
32
33
    public static function attribute(string $name, $value = null)
34
    {
35
        $route = self::getInstance()->inSave();
36
37
        if(null === $value){
38
            return (isset($route['attributes'][$name])) ? $route['attributes'][$name] : null;
39
        }
40
41
        self::getInstance()->throwCallable($value);
42
        $route['attributes'][$name] = $value;
43
        self::getInstance()->updateRoute($route, array_key_last(self::getInstance()->getRoutes()));
44
        return self::getInstance();
45
    }
46
47
    public static function group(string $prefix, \Closure $closure): Router
48
    {
49
        $id = sha1(date('d/m/Y h:m:i'));
50
        while(array_key_exists($id, self::getInstance()->groupsName)){
51
            $id = sha1(date('d/m/Y h:m:i').$id);
52
        }
53
54
        self::getInstance()->groupsName[$id] = $id;
55
        
56
        self::getInstance()->setPrefix($prefix);
57
        
58
        self::getInstance()->setGroup($id);
59
60
        $closure();
61
62
        self::getInstance()->setGroup(null);
63
        self::getInstance()->setPrefix('');
64
        return self::getInstance();
65
    }
66
67
    public static function load(?string $name = null): RouterInterface
68
    {
69
        self::getInstance()->loaded = true;
70
71
        if(null !== $name){
72
            return self::getInstance()->loadByName($name);
73
        }
74
75
        self::getInstance()->sortRoutes();
76
77
        $requestMethod = (isset($_REQUEST['REQUEST_METHOD'])) ? $_REQUEST['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD'];
78
79
        foreach(self::getInstance()->getRoutes() as $r => $route){
80
            self::getInstance()->currentRoute = $route;
81
            self::getInstance()->currentRoute['name'] = $r;
82
83
            try{
84
                self::getInstance()->checkMethod($route, $requestMethod);
85
                self::getInstance()->checkData($route, (new Uri($_SERVER['REQUEST_URI']))->getPath());
86
                return self::getInstance();
87
            }catch(\Exception $er){
88
                continue;
89
            }
90
        }
91
        
92
        self::getInstance()->currentRoute = [];
93
94
        self::getInstance()->error = new \Exception('Not found', 404);
95
96
        return self::getInstance();
97
    }
98
99
    public static function run(?string $name = null): RouterInterface
100
    {
101
        if(!self::getInstance()->loaded){
102
            self::getInstance()->load($name);
103
        }
104
105
        self::getInstance()->checkError();
106
107
        self::getInstance()->handleMiddlewares();
108
109
        self::getInstance()->executeBefore();
110
        
111
        try{
112
            $action = unserialize(self::getInstance()->current()['action']);
113
            self::getInstance()->executeRouteAction( (is_string($action)) ? $action : $action->getClosure()  );
114
        }catch(\Exception $er){
115
            self::getInstance()->error = $er;
116
        }
117
        
118
        self::getInstance()->executeAfter();
119
        
120
        self::getInstance()->checkError();
121
122
        return self::getInstance();
123
    }
124
125
    private function checkError(): void
126
    {
127
        if(isset($this->error)){
128
            throw $this->error;
129
        }
130
    }
131
132
    private function loadByName(string $name): RouterInterface
133
    {
134
        $this->hasRouteName($name);
135
        $this->currentRoute = $this->getRoutes()[$name];
136
        return $this;
137
    }
138
139
    public static function routes(?array $routes = null): array
140
    {
141
        if(null !== $routes){
142
            self::getInstance()->setRoutes($routes);
143
            self::getInstance()->sortRoutes();
144
        }
145
        return self::getInstance()->routes;
146
    }
147
   
148
}
149