Passed
Branch v2-dev (5d4b18)
by Henri
01:19
created

Router::defineHost()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 1
dl 0
loc 4
rs 10
1
<?php
2
3
namespace HnrAzevedo\Router;
4
5
use HnrAzevedo\Http\Uri;
6
7
class Router implements RouterInterface
8
{
9
    use DefinitionsTrait, 
0 ignored issues
show
Bug introduced by
The trait HnrAzevedo\Router\MiddlewareTrait requires the property $handle which is not provided by HnrAzevedo\Router\Router.
Loading history...
10
        RunInTrait, 
11
        CheckTrait, 
12
        OwnerTrait, 
13
        MiddlewareTrait, 
14
        WhereTrait,
15
        PrioritizeTrait;
16
17
    private array $currentRoute = [];
18
    private string $prefix = '';
19
    private ?\Exception $error = null;
20
21
    public static function name(string $name): Router
22
    {
23
        self::getInstance()->isInNameGroup();
24
        self::getInstance()->existRouteName($name);
25
        $route = self::getInstance()->inSave();
26
        $route['name'] = $name;
27
        self::getInstance()->routesName[$name] = $name;
28
        self::getInstance()->unsetRoute(array_key_last(self::getInstance()->getRoutes()))->updateRoute($route,$name);
29
        return self::getInstance();
30
    }
31
32
    public static function group(string $prefix, \Closure $closure): Router
33
    {
34
        self::getInstance()->prefix = $prefix;
35
        self::getInstance()->group = sha1(date('d/m/Y h:m:i'));
36
37
        $closure();
38
39
        self::getInstance()->group = null;
40
        self::getInstance()->prefix = null;
41
        return self::getInstance();
42
    }
43
44
    public static function current(): array
45
    {
46
        self::getInstance()->hasCurrentRoute();
47
        return self::getInstance()->currentRoute;
48
    }
49
50
    public static function currentName(): string
51
    {
52
        self::getInstance()->hasCurrentRoute();
53
        return self::getInstance()->currentRoute['name'];
54
    }
55
56
    public static function currentAction()
57
    {
58
        self::getInstance()->hasCurrentRoute();
59
        return self::getInstance()->currentRoute['action'];
60
    }
61
62
    public static function load(): RouterInterface
63
    {
64
        self::getInstance()->loaded = true;
65
        self::getInstance()->sortRoutes();
66
67
        foreach(self::getInstance()->getRoutes() as $r => $route){
68
            self::getInstance()->currentRoute = $route;
69
            self::getInstance()->currentRoute['name'] = $r;
70
71
            try{
72
                self::getInstance()->checkMethod($route, $_SERVER['REQUEST_METHOD']);
73
                self::getInstance()->checkData($route, (new Uri($_SERVER['REQUEST_URI']))->getPath());
74
                return self::getInstance();
75
            }catch(\Exception $er){
76
                continue;
77
            }
78
        }
79
        
80
        self::getInstance()->currentRoute = [];
81
        throw new \Exception('Page not found', 404);
82
    }
83
84
    public static function run(): RouterInterface
85
    {
86
        if(!self::getInstance()->loaded){
87
            self::getInstance()->load();
88
        }
89
90
        self::getInstance()->executeBefore();
91
        
92
        try{
93
            self::getInstance()->executeRouteAction();
94
        }catch(\Exception $er){
95
            self::getInstance()->error = $er;
96
        }
97
        
98
        self::getInstance()->executeAfter();
99
        
100
        self::getInstance()->checkError();
101
102
        return self::getInstance();
103
    }
104
105
    private function checkError(): void
106
    {
107
        if(isset($this->error)){
108
            throw $this->error;
109
        }
110
    }
111
   
112
}