Passed
Push — master ( 022aa2...8d4f2f )
by Henri
04:23 queued 47s
created

Router::checkError()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 2
nc 2
nop 0
dl 0
loc 4
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
        foreach(self::getInstance()->getRoutes() as $r => $route){
64
            self::getInstance()->currentRoute = $route;
65
            self::getInstance()->currentRoute['name'] = $r;
66
67
            try{
68
                self::getInstance()->checkMethod($route, $_SERVER['REQUEST_METHOD']);
69
                self::getInstance()->checkData($route, (new Uri($_SERVER['REQUEST_URI']))->getPath());
70
                return self::getInstance();
71
            }catch(\Exception $er){
72
                continue;
73
            }
74
        }
75
        
76
        self::getInstance()->currentRoute = [];
77
78
        self::getInstance()->error = new \Exception('Not found', 404);
79
80
        return self::getInstance();
81
    }
82
83
    public static function run(?string $name = null): RouterInterface
84
    {
85
        if(!self::getInstance()->loaded){
86
            self::getInstance()->load($name);
87
        }
88
89
        self::getInstance()->checkError();
90
91
        self::getInstance()->handleMiddlewares();
92
93
        self::getInstance()->executeBefore();
94
        
95
        try{
96
            self::getInstance()->executeRouteAction(self::getInstance()->current()['action']);
97
        }catch(\Exception $er){
98
            self::getInstance()->error = $er;
99
        }
100
        
101
        self::getInstance()->executeAfter();
102
        
103
        self::getInstance()->checkError();
104
105
        return self::getInstance();
106
    }
107
108
    private function checkError(): void
109
    {
110
        if(isset($this->error)){
111
            throw $this->error;
112
        }
113
    }
114
115
    private function loadByName(string $name): RouterInterface
116
    {
117
        $this->hasRouteName($name);
118
        $this->currentRoute = $this->getRoutes()[$name];
119
        return $this;
120
    }
121
   
122
}
123