Passed
Branch master (b146cb)
by Henri
03:17
created

Router::routes()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
nc 2
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
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 group(string $prefix, \Closure $closure): Router
34
    {
35
        $id = sha1(date('d/m/Y h:m:i'));
36
        while(array_key_exists($id, self::getInstance()->groupsName)){
37
            $id = sha1(date('d/m/Y h:m:i').$id);
38
        }
39
40
        self::getInstance()->groupsName[$id] = $id;
41
        
42
        self::getInstance()->setPrefix($prefix);
43
        
44
        self::getInstance()->setGroup($id);
45
46
        $closure();
47
48
        self::getInstance()->setGroup(null);
49
        self::getInstance()->setPrefix('');
50
        return self::getInstance();
51
    }
52
53
    public static function load(?string $name = null): RouterInterface
54
    {
55
        self::getInstance()->loaded = true;
56
57
        if(null !== $name){
58
            return self::getInstance()->loadByName($name);
59
        }
60
61
        self::getInstance()->sortRoutes();
62
63
        $requestMethod = (isset($_REQUEST['REQUEST_METHOD'])) ? $_REQUEST['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD'];
64
65
        foreach(self::getInstance()->getRoutes() as $r => $route){
66
            self::getInstance()->currentRoute = $route;
67
            self::getInstance()->currentRoute['name'] = $r;
68
69
            try{
70
                self::getInstance()->checkMethod($route, $requestMethod);
71
                self::getInstance()->checkData($route, (new Uri($_SERVER['REQUEST_URI']))->getPath());
72
                return self::getInstance();
73
            }catch(\Exception $er){
74
                continue;
75
            }
76
        }
77
        
78
        self::getInstance()->currentRoute = [];
79
80
        self::getInstance()->error = new \Exception('Not found', 404);
81
82
        return self::getInstance();
83
    }
84
85
    public static function run(?string $name = null): RouterInterface
86
    {
87
        if(!self::getInstance()->loaded){
88
            self::getInstance()->load($name);
89
        }
90
91
        self::getInstance()->checkError();
92
93
        self::getInstance()->handleMiddlewares();
94
95
        self::getInstance()->executeBefore();
96
        
97
        try{
98
            $action = unserialize(self::getInstance()->current()['action']);
99
            self::getInstance()->executeRouteAction( (is_string($action)) ? $action : $action->getClosure()  );
100
        }catch(\Exception $er){
101
            self::getInstance()->error = $er;
102
        }
103
        
104
        self::getInstance()->executeAfter();
105
        
106
        self::getInstance()->checkError();
107
108
        return self::getInstance();
109
    }
110
111
    private function checkError(): void
112
    {
113
        if(isset($this->error)){
114
            throw $this->error;
115
        }
116
    }
117
118
    private function loadByName(string $name): RouterInterface
119
    {
120
        $this->hasRouteName($name);
121
        $this->currentRoute = $this->getRoutes()[$name];
122
        return $this;
123
    }
124
125
    public static function routes(?array $routes = null): array
126
    {
127
        if(null !== $routes){
128
            self::getInstance()->setRoutes($routes);
129
            self::getInstance()->sortRoutes();
130
        }
131
        return self::getInstance()->routes;
132
    }
133
   
134
}
135