Passed
Push — master ( 7482d2...8d9701 )
by Henri
01:37
created

Router::groupAttribute()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 4
eloc 7
c 1
b 0
f 1
nc 3
nop 3
dl 0
loc 12
rs 10
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): Router
34
    {
35
        $route = self::getInstance()->inSave();
36
37
        if(null === $value){
38
            return (isset($route['attributes'][$name])) ? $route['attributes'][$name] : null;
0 ignored issues
show
Bug Best Practice introduced by
The expression return IssetNode ? $rout...ributes'][$name] : null could return the type null which is incompatible with the type-hinted return HnrAzevedo\Router\Router. Consider adding an additional type-check to rule them out.
Loading history...
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 groupAttribute(string $name, $value = null, ?array $excepts = []): Router
48
    {
49
        $group = self::getInstance()->inSave()['group'];
50
        foreach(self::getInstance()->getRoutes() as $r => $route){
51
            if($route['group'] !== $group || in_array($route['name'], $excepts)){
52
                continue;
53
            }
54
55
            $route['attributes'] = array_merge([$name => $value], $route['attributes']);
56
            self::getInstance()->updateRoute($route, $r);
57
        }
58
        return self::getInstance();
59
    }
60
61
    public static function group(string $prefix, \Closure $closure): Router
62
    {
63
        $id = sha1(date('d/m/Y h:m:i'));
64
        while(array_key_exists($id, self::getInstance()->groupsName)){
65
            $id = sha1(date('d/m/Y h:m:i').$id);
66
        }
67
68
        self::getInstance()->groupsName[$id] = $id;
69
        
70
        self::getInstance()->setPrefix($prefix);
71
        
72
        self::getInstance()->setGroup($id);
73
74
        $closure();
75
76
        self::getInstance()->setGroup(null);
77
        self::getInstance()->setPrefix('');
78
        return self::getInstance();
79
    }
80
81
    public static function load(?string $name = null): RouterInterface
82
    {
83
        self::getInstance()->loaded = true;
84
85
        if(null !== $name){
86
            return self::getInstance()->loadByName($name);
87
        }
88
89
        self::getInstance()->sortRoutes();
90
91
        $requestMethod = (isset($_REQUEST['REQUEST_METHOD'])) ? $_REQUEST['REQUEST_METHOD'] : $_SERVER['REQUEST_METHOD'];
92
93
        foreach(self::getInstance()->getRoutes() as $r => $route){
94
            self::getInstance()->currentRoute = $route;
95
            self::getInstance()->currentRoute['name'] = $r;
96
97
            try{
98
                self::getInstance()->checkMethod($route, $requestMethod);
99
                self::getInstance()->checkData($route, (new Uri($_SERVER['REQUEST_URI']))->getPath());
100
                return self::getInstance();
101
            }catch(\Exception $er){
102
                continue;
103
            }
104
        }
105
        
106
        self::getInstance()->currentRoute = [];
107
108
        self::getInstance()->error = new \Exception('Not found', 404);
109
110
        return self::getInstance();
111
    }
112
113
    public static function run(?string $name = null): RouterInterface
114
    {
115
        if(!self::getInstance()->loaded){
116
            self::getInstance()->load($name);
117
        }
118
119
        self::getInstance()->checkError();
120
121
        self::getInstance()->handleMiddlewares();
122
123
        self::getInstance()->executeBefore();
124
        
125
        try{
126
            $action = unserialize(self::getInstance()->current()['action']);
127
            self::getInstance()->executeRouteAction( (is_string($action)) ? $action : $action->getClosure()  );
128
        }catch(\Exception $er){
129
            self::getInstance()->error = $er;
130
        }
131
        
132
        self::getInstance()->executeAfter();
133
        
134
        self::getInstance()->checkError();
135
136
        return self::getInstance();
137
    }
138
139
    private function checkError(): void
140
    {
141
        if(isset($this->error)){
142
            throw $this->error;
143
        }
144
    }
145
146
    private function loadByName(string $name): RouterInterface
147
    {
148
        $this->hasRouteName($name);
149
        $this->currentRoute = $this->getRoutes()[$name];
150
        return $this;
151
    }
152
153
    public static function routes(?array $routes = null): array
154
    {
155
        if(null !== $routes){
156
            self::getInstance()->setRoutes($routes);
157
            self::getInstance()->sortRoutes();
158
        }
159
        return self::getInstance()->routes;
160
    }
161
   
162
}
163