... | ... |
@@ -113,7 +113,7 @@ class Router{ |
113 | 113 |
public function match($request){ |
114 | 114 |
|
115 | 115 |
if(is_null($request->path)){ |
116 |
- $auri = array(); |
|
116 |
+ $auri = array(0 =>""); |
|
117 | 117 |
} |
118 | 118 |
else{ |
119 | 119 |
$auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B")); |
... | ... |
@@ -126,7 +126,7 @@ class Router{ |
126 | 126 |
$method = $routeInfo->method; |
127 | 127 |
if($method=='ANY' || strpos($request->method,$method)!==false){ |
128 | 128 |
if(is_null($route)){ |
129 |
- $aroute = array(); |
|
129 |
+ $aroute = array(0=>""); |
|
130 | 130 |
} |
131 | 131 |
else{ |
132 | 132 |
$aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
... | ... |
@@ -168,7 +168,7 @@ class Router{ |
168 | 168 |
$route_pattern = $routeInfo->path; |
169 | 169 |
$method = $routeInfo->method; |
170 | 170 |
if($method=='ANY' || strpos($request->method, $method)!==false){ |
171 |
- if(\preg_match($route_pattern, $request->path, $match, \PREG_OFFSET_CAPTURE)){ |
|
171 |
+ if(!\is_null($request->path) && \preg_match($route_pattern, $request->path, $match, \PREG_OFFSET_CAPTURE)){ |
|
172 | 172 |
$this->parsedParameters = $this->cleanPregMatch($match); |
173 | 173 |
$this->depth = $curi; |
174 | 174 |
$this->routeInfo = $routeInfo; |
... | ... |
@@ -112,7 +112,12 @@ class Router{ |
112 | 112 |
|
113 | 113 |
public function match($request){ |
114 | 114 |
|
115 |
- $auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B")); |
|
115 |
+ if(is_null($request->path)){ |
|
116 |
+ $auri = array(); |
|
117 |
+ } |
|
118 |
+ else{ |
|
119 |
+ $auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B")); |
|
120 |
+ } |
|
116 | 121 |
$curi = count($auri); |
117 | 122 |
|
118 | 123 |
foreach ($this->routes as $routeInfo) { |
... | ... |
@@ -120,7 +125,13 @@ class Router{ |
120 | 125 |
$route = $routeInfo->path; |
121 | 126 |
$method = $routeInfo->method; |
122 | 127 |
if($method=='ANY' || strpos($request->method,$method)!==false){ |
123 |
- $aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
|
128 |
+ if(is_null($route)){ |
|
129 |
+ $aroute = array(); |
|
130 |
+ } |
|
131 |
+ else{ |
|
132 |
+ $aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
|
133 |
+ } |
|
134 |
+ |
|
124 | 135 |
//print_r($aroute); |
125 | 136 |
if($curi==count($aroute)){ //compare path element count |
126 | 137 |
//optimistic assumption :) |
... | ... |
@@ -177,6 +188,7 @@ class Router{ |
177 | 188 |
} |
178 | 189 |
|
179 | 190 |
public function calculateRequestDepth($request){ |
191 |
+ if(is_null($request->path)) return 0; |
|
180 | 192 |
return count(explode('/',trim($request->path, "/ \t\n\r\0\x0B"))); |
181 | 193 |
} |
182 | 194 |
|
... | ... |
@@ -100,6 +100,16 @@ class Router{ |
100 | 100 |
return $this; |
101 | 101 |
} |
102 | 102 |
|
103 |
+ public function cleanPregMatch($match){ |
|
104 |
+ $cleanMatch = array(); |
|
105 |
+ foreach($match as $key => $value){ |
|
106 |
+ if($value[1]>-1){ |
|
107 |
+ $cleanMatch[$key] = $value[0]; |
|
108 |
+ } |
|
109 |
+ } |
|
110 |
+ return $cleanMatch; |
|
111 |
+ } |
|
112 |
+ |
|
103 | 113 |
public function match($request){ |
104 | 114 |
|
105 | 115 |
$auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B")); |
... | ... |
@@ -147,8 +157,8 @@ class Router{ |
147 | 157 |
$route_pattern = $routeInfo->path; |
148 | 158 |
$method = $routeInfo->method; |
149 | 159 |
if($method=='ANY' || strpos($request->method, $method)!==false){ |
150 |
- if(\preg_match($route_pattern, $request->path, $match)){ |
|
151 |
- $this->parsedParameters = $match; |
|
160 |
+ if(\preg_match($route_pattern, $request->path, $match, \PREG_OFFSET_CAPTURE)){ |
|
161 |
+ $this->parsedParameters = $this->cleanPregMatch($match); |
|
152 | 162 |
$this->depth = $curi; |
153 | 163 |
$this->routeInfo = $routeInfo; |
154 | 164 |
return $routeInfo->result; |
... | ... |
@@ -25,6 +25,12 @@ class Router{ |
25 | 25 |
return $this; |
26 | 26 |
} |
27 | 27 |
|
28 |
+ public function add_preg($method, $path, $result, $name = ''){ |
|
29 |
+ $this->routes[] = new RouteInfo($method, $path, $result, $name, RouteInfo::REGEX); |
|
30 |
+ if(isset($name)&&$name!='') $this->routeNameIndex[$name] = &$this->routes[count($this->routes)-1]; |
|
31 |
+ return $this; |
|
32 |
+ } |
|
33 |
+ |
|
28 | 34 |
public function add404($result){ |
29 | 35 |
return $this->add('404', '', $result, _L3_ROUTE_404_NAME); |
30 | 36 |
} |
... | ... |
@@ -53,6 +59,32 @@ class Router{ |
53 | 59 |
return $this->add('ANY', $path, $result, $name); |
54 | 60 |
} |
55 | 61 |
|
62 |
+ // Regular expression based routes |
|
63 |
+ |
|
64 |
+ public function get_preg($path, $result, $name = ''){ |
|
65 |
+ return $this->add_preg('GET', $path, $result, $name); |
|
66 |
+ } |
|
67 |
+ |
|
68 |
+ public function post_preg($path, $result, $name = ''){ |
|
69 |
+ return $this->add_preg('POST', $path, $result, $name); |
|
70 |
+ } |
|
71 |
+ |
|
72 |
+ public function put_preg($path, $result, $name = ''){ |
|
73 |
+ return $this->add_preg('PUT', $path, $result, $name); |
|
74 |
+ } |
|
75 |
+ |
|
76 |
+ public function patch_preg($path, $result, $name = ''){ |
|
77 |
+ return $this->add_preg('PATCH', $path, $result, $name); |
|
78 |
+ } |
|
79 |
+ |
|
80 |
+ public function delete_preg($path, $result, $name = ''){ |
|
81 |
+ return $this->add_preg('DELETE', $path, $result, $name); |
|
82 |
+ } |
|
83 |
+ |
|
84 |
+ public function any_preg($path, $result, $name = ''){ |
|
85 |
+ return $this->add_preg('ANY', $path, $result, $name); |
|
86 |
+ } |
|
87 |
+ |
|
56 | 88 |
public function addBeforeAction($event_handler){ |
57 | 89 |
$this->routes[count($this->routes)-1]->addBeforeAction($event_handler); |
58 | 90 |
return $this; |
... | ... |
@@ -74,36 +106,49 @@ class Router{ |
74 | 106 |
$curi = count($auri); |
75 | 107 |
|
76 | 108 |
foreach ($this->routes as $routeInfo) { |
77 |
- |
|
78 |
- $route = $routeInfo->path; |
|
79 |
- $method = $routeInfo->method; |
|
80 |
- if($method=='ANY' || strpos($request->method,$method)!==false){ |
|
81 |
- $aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
|
82 |
- //print_r($aroute); |
|
83 |
- if($curi==count($aroute)){ //compare path element count |
|
84 |
- //optimistic assumption :) |
|
85 |
- $matchResult = true; |
|
86 |
- for($i = 0; $i<$curi; $i++){ |
|
87 |
- $pathPartName = trim($aroute[$i],'{}'); |
|
88 |
- if($aroute[$i]==$pathPartName){ |
|
89 |
- if($auri[$i]!=$pathPartName){ |
|
90 |
- //echo "diffrence found"; |
|
91 |
- $matchResult = false; |
|
92 |
- break; |
|
109 |
+ if($routeInfo->type == RouteInfo::L3){ |
|
110 |
+ $route = $routeInfo->path; |
|
111 |
+ $method = $routeInfo->method; |
|
112 |
+ if($method=='ANY' || strpos($request->method,$method)!==false){ |
|
113 |
+ $aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
|
114 |
+ //print_r($aroute); |
|
115 |
+ if($curi==count($aroute)){ //compare path element count |
|
116 |
+ //optimistic assumption :) |
|
117 |
+ $matchResult = true; |
|
118 |
+ for($i = 0; $i<$curi; $i++){ |
|
119 |
+ $pathPartName = trim($aroute[$i],'{}'); |
|
120 |
+ if($aroute[$i]==$pathPartName){ |
|
121 |
+ if($auri[$i]!=$pathPartName){ |
|
122 |
+ //echo "diffrence found"; |
|
123 |
+ $matchResult = false; |
|
124 |
+ break; |
|
125 |
+ } |
|
93 | 126 |
} |
94 |
- } |
|
95 |
- else{ // {...} found -> catch $uri variable |
|
96 |
- $value = $auri[$i]; |
|
97 |
- $valueKey = explode(':', $pathPartName); |
|
98 |
- //validation |
|
99 |
- if(isset($valueKey[1]) && $valueKey[1]=='int'){ |
|
100 |
- $value = intval($value); |
|
127 |
+ else{ // {...} found -> catch $uri variable |
|
128 |
+ $value = $auri[$i]; |
|
129 |
+ $valueKey = explode(':', $pathPartName); |
|
130 |
+ //validation |
|
131 |
+ if(isset($valueKey[1]) && $valueKey[1]=='int'){ |
|
132 |
+ $value = intval($value); |
|
133 |
+ } |
|
134 |
+ //value store... |
|
135 |
+ $this->parsedParameters[$valueKey[0]] = $value; |
|
101 | 136 |
} |
102 |
- //value store... |
|
103 |
- $this->parsedParameters[$valueKey[0]] = $value; |
|
137 |
+ } |
|
138 |
+ if($matchResult){ // match found |
|
139 |
+ $this->depth = $curi; |
|
140 |
+ $this->routeInfo = $routeInfo; |
|
141 |
+ return $routeInfo->result; |
|
104 | 142 |
} |
105 | 143 |
} |
106 |
- if($matchResult){ // match found |
|
144 |
+ } |
|
145 |
+ } |
|
146 |
+ if($routeInfo->type == RouteInfo::REGEX){ |
|
147 |
+ $route_pattern = $routeInfo->path; |
|
148 |
+ $method = $routeInfo->method; |
|
149 |
+ if($method=='ANY' || strpos($request->method, $method)!==false){ |
|
150 |
+ if(\preg_match($route_pattern, $request->path, $match)){ |
|
151 |
+ $this->parsedParameters = $match; |
|
107 | 152 |
$this->depth = $curi; |
108 | 153 |
$this->routeInfo = $routeInfo; |
109 | 154 |
return $routeInfo->result; |
... | ... |
@@ -142,12 +187,15 @@ class Router{ |
142 | 187 |
|
143 | 188 |
public function link($name, $parameters){ |
144 | 189 |
$route = $this->routeNameIndex[$name]; |
190 |
+ if($route->type == RouteInfo::REGEX){ |
|
191 |
+ throw new \Exception("Method Router::link not applicable to REGEX routes."); |
|
192 |
+ } |
|
145 | 193 |
$fields = array_keys($parameters); |
146 | 194 |
$values = array_values($parameters); |
147 | 195 |
array_walk($fields, function (&$item, $key){ |
148 | 196 |
$item = "/\{".$item."\}/"; |
149 | 197 |
}); |
150 |
- return preg_replace($fields, $values, $route->Path); |
|
198 |
+ return preg_replace($fields, $values, $route->path); |
|
151 | 199 |
} |
152 | 200 |
|
153 | 201 |
public function getParameter($name){ |
... | ... |
@@ -136,6 +136,10 @@ class Router{ |
136 | 136 |
} |
137 | 137 |
} |
138 | 138 |
|
139 |
+ public function is_Match404(){ |
|
140 |
+ return isset($this->routeInfo) && ($this->routeInfo->name === _L3_ROUTE_404_NAME); |
|
141 |
+ } |
|
142 |
+ |
|
139 | 143 |
public function link($name, $parameters){ |
140 | 144 |
$route = $this->routeNameIndex[$name]; |
141 | 145 |
$fields = array_keys($parameters); |
... | ... |
@@ -2,6 +2,7 @@ |
2 | 2 |
|
3 | 3 |
namespace elanpl\L3; |
4 | 4 |
|
5 |
+define('_L3_ROUTE_404_NAME', '_L3_404'); |
|
5 | 6 |
class Router{ |
6 | 7 |
|
7 | 8 |
protected $routes; // The defined routes collection |
... | ... |
@@ -24,6 +25,10 @@ class Router{ |
24 | 25 |
return $this; |
25 | 26 |
} |
26 | 27 |
|
28 |
+ public function add404($result){ |
|
29 |
+ return $this->add('404', '', $result, _L3_ROUTE_404_NAME); |
|
30 |
+ } |
|
31 |
+ |
|
27 | 32 |
public function get($path, $result, $name = ''){ |
28 | 33 |
return $this->add('GET', $path, $result, $name); |
29 | 34 |
} |
... | ... |
@@ -109,6 +114,28 @@ class Router{ |
109 | 114 |
return false; |
110 | 115 |
} |
111 | 116 |
|
117 |
+ public function getRouteInfo($name){ |
|
118 |
+ if(isset($this->routeNameIndex[$name])) |
|
119 |
+ return $this->routeNameIndex[$name]; |
|
120 |
+ else |
|
121 |
+ return false; |
|
122 |
+ } |
|
123 |
+ |
|
124 |
+ public function calculateRequestDepth($request){ |
|
125 |
+ return count(explode('/',trim($request->path, "/ \t\n\r\0\x0B"))); |
|
126 |
+ } |
|
127 |
+ |
|
128 |
+ public function setMatch404($request){ |
|
129 |
+ if($routeInfo404 = $this->getRouteInfo(_L3_ROUTE_404_NAME)){ |
|
130 |
+ $this->depth = $this->calculateRequestDepth($request); |
|
131 |
+ $this->routeInfo = $routeInfo404; |
|
132 |
+ return $routeInfo404->result; |
|
133 |
+ } |
|
134 |
+ else{ |
|
135 |
+ return false; |
|
136 |
+ } |
|
137 |
+ } |
|
138 |
+ |
|
112 | 139 |
public function link($name, $parameters){ |
113 | 140 |
$route = $this->routeNameIndex[$name]; |
114 | 141 |
$fields = array_keys($parameters); |
... | ... |
@@ -65,7 +65,7 @@ class Router{ |
65 | 65 |
|
66 | 66 |
public function match($request){ |
67 | 67 |
|
68 |
- $auri = explode('/', trim($request->Path, "/ \t\n\r\0\x0B")); |
|
68 |
+ $auri = explode('/', trim($request->path, "/ \t\n\r\0\x0B")); |
|
69 | 69 |
$curi = count($auri); |
70 | 70 |
|
71 | 71 |
foreach ($this->routes as $routeInfo) { |
... | ... |
@@ -101,7 +101,7 @@ class Router{ |
101 | 101 |
if($matchResult){ // match found |
102 | 102 |
$this->depth = $curi; |
103 | 103 |
$this->routeInfo = $routeInfo; |
104 |
- return $routeInfo->Result; |
|
104 |
+ return $routeInfo->result; |
|
105 | 105 |
} |
106 | 106 |
} |
107 | 107 |
} |
... | ... |
@@ -8,7 +8,7 @@ class Router{ |
8 | 8 |
protected $routeNameIndex; // An array with elements that reference to the routes ordered by a route names |
9 | 9 |
public $parsedParameters; // Parameters parsed from Request Path |
10 | 10 |
public $depth; // Number of nested nodes in Request Path |
11 |
- public $RouteInfo; // The RouteInfo object if the route was matched |
|
11 |
+ public $routeInfo; // The RouteInfo object if the route was matched |
|
12 | 12 |
|
13 | 13 |
public function __construct($routing) |
14 | 14 |
{ |
... | ... |
@@ -18,61 +18,61 @@ class Router{ |
18 | 18 |
$routing->set($this); |
19 | 19 |
} |
20 | 20 |
|
21 |
- public function add($Method, $Path, $Result, $Name = ''){ |
|
22 |
- $this->routes[] = new RouteInfo($Method, $Path, $Result, $Name); |
|
23 |
- if(isset($Name)&&$Name!='') $this->routeNameIndex[$Name] = &$this->routes[count($this->routes)-1]; |
|
21 |
+ public function add($method, $path, $result, $name = ''){ |
|
22 |
+ $this->routes[] = new RouteInfo($method, $path, $result, $name); |
|
23 |
+ if(isset($name)&&$name!='') $this->routeNameIndex[$name] = &$this->routes[count($this->routes)-1]; |
|
24 | 24 |
return $this; |
25 | 25 |
} |
26 | 26 |
|
27 |
- public function get($Path, $Result, $Name = ''){ |
|
28 |
- return $this->add('GET', $Path, $Result, $Name); |
|
27 |
+ public function get($path, $result, $name = ''){ |
|
28 |
+ return $this->add('GET', $path, $result, $name); |
|
29 | 29 |
} |
30 | 30 |
|
31 |
- public function post($Path, $Result, $Name = ''){ |
|
32 |
- return $this->add('POST', $Path, $Result, $Name); |
|
31 |
+ public function post($path, $result, $name = ''){ |
|
32 |
+ return $this->add('POST', $path, $result, $name); |
|
33 | 33 |
} |
34 | 34 |
|
35 |
- public function put($Path, $Result, $Name = ''){ |
|
36 |
- return $this->add('PUT', $Path, $Result, $Name); |
|
35 |
+ public function put($path, $result, $name = ''){ |
|
36 |
+ return $this->add('PUT', $path, $result, $name); |
|
37 | 37 |
} |
38 | 38 |
|
39 |
- public function patch($Path, $Result, $Name = ''){ |
|
40 |
- return $this->add('PATCH', $Path, $Result, $Name); |
|
39 |
+ public function patch($path, $result, $name = ''){ |
|
40 |
+ return $this->add('PATCH', $path, $result, $name); |
|
41 | 41 |
} |
42 | 42 |
|
43 |
- public function delete($Path, $Result, $Name = ''){ |
|
44 |
- return $this->add('DELETE', $Path, $Result, $Name); |
|
43 |
+ public function delete($path, $result, $name = ''){ |
|
44 |
+ return $this->add('DELETE', $path, $result, $name); |
|
45 | 45 |
} |
46 | 46 |
|
47 |
- public function any($Path, $Result, $Name = ''){ |
|
48 |
- return $this->add('ANY', $Path, $Result, $Name); |
|
47 |
+ public function any($path, $result, $name = ''){ |
|
48 |
+ return $this->add('ANY', $path, $result, $name); |
|
49 | 49 |
} |
50 | 50 |
|
51 |
- public function AddBeforeAction($event_handler){ |
|
52 |
- $this->routes[count($this->routes)-1]->AddBeforeAction($event_handler); |
|
51 |
+ public function addBeforeAction($event_handler){ |
|
52 |
+ $this->routes[count($this->routes)-1]->addBeforeAction($event_handler); |
|
53 | 53 |
return $this; |
54 | 54 |
} |
55 | 55 |
|
56 |
- public function AddAfterAction($event_handler){ |
|
57 |
- $this->routes[count($this->routes)-1]->AddAfterAction($event_handler); |
|
56 |
+ public function addAfterAction($event_handler){ |
|
57 |
+ $this->routes[count($this->routes)-1]->addAfterAction($event_handler); |
|
58 | 58 |
return $this; |
59 | 59 |
} |
60 | 60 |
|
61 |
- public function AddAfterResult($event_handler){ |
|
62 |
- $this->routes[count($this->routes)-1]->AddAfterAction($event_handler); |
|
61 |
+ public function addAfterResult($event_handler){ |
|
62 |
+ $this->routes[count($this->routes)-1]->addAfterAction($event_handler); |
|
63 | 63 |
return $this; |
64 | 64 |
} |
65 | 65 |
|
66 |
- public function match($Request){ |
|
66 |
+ public function match($request){ |
|
67 | 67 |
|
68 |
- $auri = explode('/', trim($Request->Path, "/ \t\n\r\0\x0B")); |
|
68 |
+ $auri = explode('/', trim($request->Path, "/ \t\n\r\0\x0B")); |
|
69 | 69 |
$curi = count($auri); |
70 | 70 |
|
71 | 71 |
foreach ($this->routes as $routeInfo) { |
72 | 72 |
|
73 |
- $route = $routeInfo->Path; |
|
74 |
- $method = $routeInfo->Method; |
|
75 |
- if($method=='ANY' || strpos($Request->Method,$method)!==false){ |
|
73 |
+ $route = $routeInfo->path; |
|
74 |
+ $method = $routeInfo->method; |
|
75 |
+ if($method=='ANY' || strpos($request->method,$method)!==false){ |
|
76 | 76 |
$aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
77 | 77 |
//print_r($aroute); |
78 | 78 |
if($curi==count($aroute)){ //compare path element count |
... | ... |
@@ -100,7 +100,7 @@ class Router{ |
100 | 100 |
} |
101 | 101 |
if($matchResult){ // match found |
102 | 102 |
$this->depth = $curi; |
103 |
- $this->RouteInfo = $routeInfo; |
|
103 |
+ $this->routeInfo = $routeInfo; |
|
104 | 104 |
return $routeInfo->Result; |
105 | 105 |
} |
106 | 106 |
} |
... | ... |
@@ -119,7 +119,7 @@ class Router{ |
119 | 119 |
return preg_replace($fields, $values, $route->Path); |
120 | 120 |
} |
121 | 121 |
|
122 |
- public function GetParameter($name){ |
|
122 |
+ public function getParameter($name){ |
|
123 | 123 |
return $this->parsedParameters[$name]; |
124 | 124 |
} |
125 | 125 |
|
... | ... |
@@ -5,10 +5,10 @@ namespace elanpl\L3; |
5 | 5 |
class Router{ |
6 | 6 |
|
7 | 7 |
protected $routes; // The defined routes collection |
8 |
- protected $parsedParameters; // Parameters parsed from Request Path |
|
9 |
- protected $depth; // Number of nested nodes in Request Path |
|
10 | 8 |
protected $routeNameIndex; // An array with elements that reference to the routes ordered by a route names |
11 |
- public $RouteInfo; // The RouteInfo objcet if the route was matched |
|
9 |
+ public $parsedParameters; // Parameters parsed from Request Path |
|
10 |
+ public $depth; // Number of nested nodes in Request Path |
|
11 |
+ public $RouteInfo; // The RouteInfo object if the route was matched |
|
12 | 12 |
|
13 | 13 |
public function __construct($routing) |
14 | 14 |
{ |
... | ... |
@@ -4,71 +4,71 @@ namespace elanpl\L3; |
4 | 4 |
|
5 | 5 |
class Router{ |
6 | 6 |
|
7 |
- //protected static $_instance; // object instance (for fluent api) |
|
8 |
- protected static $routes; // The defined routes collection |
|
9 |
- protected static $parsedParameters; // Parameters parsed from Request Path |
|
10 |
- protected static $depth; // Number of nested nodes in Request Path |
|
11 |
- protected static $routeNameIndex; // An array with elements that reference to the routes ordered by a route names |
|
12 |
- public static $RouteInfo; // The RouteInfo objcet if the route was matched |
|
13 |
- |
|
14 |
- public function __construct() |
|
7 |
+ protected $routes; // The defined routes collection |
|
8 |
+ protected $parsedParameters; // Parameters parsed from Request Path |
|
9 |
+ protected $depth; // Number of nested nodes in Request Path |
|
10 |
+ protected $routeNameIndex; // An array with elements that reference to the routes ordered by a route names |
|
11 |
+ public $RouteInfo; // The RouteInfo objcet if the route was matched |
|
12 |
+ |
|
13 |
+ public function __construct($routing) |
|
15 | 14 |
{ |
16 |
- //if(!isset(self::$_instance)) self::$_instance = new self; |
|
17 |
- if(!isset(self::$routes)) self::$routes = array(); |
|
18 |
- if(!isset(self::$routeNameIndex)) self::$routeNameIndex= array(); |
|
15 |
+ $this->routes = array(); |
|
16 |
+ $this->routeNameIndex = array(); |
|
17 |
+ //Set the routing from configuration object |
|
18 |
+ $routing->set($this); |
|
19 | 19 |
} |
20 | 20 |
|
21 |
- public static function add($Method, $Path, $Result, $Name = ''){ |
|
22 |
- self::$routes[] = new RouteInfo($Method, $Path, $Result, $Name); |
|
23 |
- if(isset($Name)&&$Name!='') self::$routeNameIndex[$Name] = &self::$routes[count(self::$routes)-1]; |
|
24 |
- return new self; |
|
21 |
+ public function add($Method, $Path, $Result, $Name = ''){ |
|
22 |
+ $this->routes[] = new RouteInfo($Method, $Path, $Result, $Name); |
|
23 |
+ if(isset($Name)&&$Name!='') $this->routeNameIndex[$Name] = &$this->routes[count($this->routes)-1]; |
|
24 |
+ return $this; |
|
25 | 25 |
} |
26 | 26 |
|
27 |
- public static function get($Path, $Result, $Name = ''){ |
|
28 |
- return self::add('GET', $Path, $Result, $Name); |
|
27 |
+ public function get($Path, $Result, $Name = ''){ |
|
28 |
+ return $this->add('GET', $Path, $Result, $Name); |
|
29 | 29 |
} |
30 | 30 |
|
31 |
- public static function post($Path, $Result, $Name = ''){ |
|
32 |
- return self::add('POST', $Path, $Result, $Name); |
|
31 |
+ public function post($Path, $Result, $Name = ''){ |
|
32 |
+ return $this->add('POST', $Path, $Result, $Name); |
|
33 | 33 |
} |
34 | 34 |
|
35 |
- public static function put($Path, $Result, $Name = ''){ |
|
36 |
- return self::add('PUT', $Path, $Result, $Name); |
|
35 |
+ public function put($Path, $Result, $Name = ''){ |
|
36 |
+ return $this->add('PUT', $Path, $Result, $Name); |
|
37 | 37 |
} |
38 | 38 |
|
39 |
- public static function patch($Path, $Result, $Name = ''){ |
|
40 |
- return self::add('PATCH', $Path, $Result, $Name); |
|
39 |
+ public function patch($Path, $Result, $Name = ''){ |
|
40 |
+ return $this->add('PATCH', $Path, $Result, $Name); |
|
41 | 41 |
} |
42 | 42 |
|
43 |
- public static function delete($Path, $Result, $Name = ''){ |
|
44 |
- return self::add('DELETE', $Path, $Result, $Name); |
|
43 |
+ public function delete($Path, $Result, $Name = ''){ |
|
44 |
+ return $this->add('DELETE', $Path, $Result, $Name); |
|
45 | 45 |
} |
46 | 46 |
|
47 |
- public static function any($Path, $Result, $Name = ''){ |
|
48 |
- return self::add('ANY', $Path, $Result, $Name); |
|
47 |
+ public function any($Path, $Result, $Name = ''){ |
|
48 |
+ return $this->add('ANY', $Path, $Result, $Name); |
|
49 | 49 |
} |
50 | 50 |
|
51 |
- public static function AddBeforeAction($event_handler){ |
|
52 |
- self::$routes[count(self::$routes)-1]->AddBeforeAction($event_handler); |
|
53 |
- return new self; |
|
51 |
+ public function AddBeforeAction($event_handler){ |
|
52 |
+ $this->routes[count($this->routes)-1]->AddBeforeAction($event_handler); |
|
53 |
+ return $this; |
|
54 | 54 |
} |
55 | 55 |
|
56 |
- public static function AddAfterAction($event_handler){ |
|
57 |
- self::$routes[count(self::$routes)-1]->AddAfterAction($event_handler); |
|
58 |
- return new self; |
|
56 |
+ public function AddAfterAction($event_handler){ |
|
57 |
+ $this->routes[count($this->routes)-1]->AddAfterAction($event_handler); |
|
58 |
+ return $this; |
|
59 | 59 |
} |
60 | 60 |
|
61 |
- public static function AddAfterResult($event_handler){ |
|
62 |
- self::$routes[count(self::$routes)-1]->AddAfterAction($event_handler); |
|
63 |
- return new self; |
|
61 |
+ public function AddAfterResult($event_handler){ |
|
62 |
+ $this->routes[count($this->routes)-1]->AddAfterAction($event_handler); |
|
63 |
+ return $this; |
|
64 | 64 |
} |
65 | 65 |
|
66 |
- public static function match($Request){ |
|
66 |
+ public function match($Request){ |
|
67 | 67 |
|
68 | 68 |
$auri = explode('/', trim($Request->Path, "/ \t\n\r\0\x0B")); |
69 | 69 |
$curi = count($auri); |
70 | 70 |
|
71 |
- foreach (self::$routes as $routeInfo) { |
|
71 |
+ foreach ($this->routes as $routeInfo) { |
|
72 | 72 |
|
73 | 73 |
$route = $routeInfo->Path; |
74 | 74 |
$method = $routeInfo->Method; |
... | ... |
@@ -95,12 +95,12 @@ class Router{ |
95 | 95 |
$value = intval($value); |
96 | 96 |
} |
97 | 97 |
//value store... |
98 |
- self::$parsedParameters[$valueKey[0]] = $value; |
|
98 |
+ $this->parsedParameters[$valueKey[0]] = $value; |
|
99 | 99 |
} |
100 | 100 |
} |
101 | 101 |
if($matchResult){ // match found |
102 |
- self::$depth = $curi; |
|
103 |
- self::$RouteInfo = $routeInfo; |
|
102 |
+ $this->depth = $curi; |
|
103 |
+ $this->RouteInfo = $routeInfo; |
|
104 | 104 |
return $routeInfo->Result; |
105 | 105 |
} |
106 | 106 |
} |
... | ... |
@@ -109,8 +109,8 @@ class Router{ |
109 | 109 |
return false; |
110 | 110 |
} |
111 | 111 |
|
112 |
- public static function link($name, $parameters){ |
|
113 |
- $route = self::$routeNameIndex[$name]; |
|
112 |
+ public function link($name, $parameters){ |
|
113 |
+ $route = $this->routeNameIndex[$name]; |
|
114 | 114 |
$fields = array_keys($parameters); |
115 | 115 |
$values = array_values($parameters); |
116 | 116 |
array_walk($fields, function (&$item, $key){ |
... | ... |
@@ -119,30 +119,8 @@ class Router{ |
119 | 119 |
return preg_replace($fields, $values, $route->Path); |
120 | 120 |
} |
121 | 121 |
|
122 |
- public function __get($name) |
|
123 |
- { |
|
124 |
- if($name=="routes") return self::$routes; |
|
125 |
- if($name=="parsedParameters") return self::$parsedParameters; |
|
126 |
- if($name=="depth") return self::$depth; |
|
127 |
- if($name=="RouteInfo") return self::$RouteInfo; |
|
128 |
- } |
|
129 |
- |
|
130 |
- public function __call($name, $arguments) |
|
131 |
- { |
|
132 |
- if($name == 'GetParameter'){ |
|
133 |
- return self::$parsedParameters[$arguments[0]]; |
|
134 |
- } |
|
135 |
- // Note: value of $name is case sensitive. |
|
136 |
- $allowed_methods = ['add', 'post', 'any', 'get', 'match', 'AddBeforeAction', 'AddAfterAction', 'AddAfterResult']; |
|
137 |
- |
|
138 |
- if(in_array($name, $allowed_methods)){ |
|
139 |
- $the_method = new \ReflectionMethod($this, $name); |
|
140 |
- $the_method->invokeArgs(NULL,$arguments); |
|
141 |
- } |
|
142 |
- else{ |
|
143 |
- throw new \Exception("Call undefined or inaccesible method ".get_class($this)."::$name"); |
|
144 |
- } |
|
145 |
- |
|
122 |
+ public function GetParameter($name){ |
|
123 |
+ return $this->parsedParameters[$name]; |
|
146 | 124 |
} |
147 | 125 |
|
148 | 126 |
} |
149 | 127 |
\ No newline at end of file |
1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,148 @@ |
1 |
+<?php |
|
2 |
+ |
|
3 |
+namespace elanpl\L3; |
|
4 |
+ |
|
5 |
+class Router{ |
|
6 |
+ |
|
7 |
+ //protected static $_instance; // object instance (for fluent api) |
|
8 |
+ protected static $routes; // The defined routes collection |
|
9 |
+ protected static $parsedParameters; // Parameters parsed from Request Path |
|
10 |
+ protected static $depth; // Number of nested nodes in Request Path |
|
11 |
+ protected static $routeNameIndex; // An array with elements that reference to the routes ordered by a route names |
|
12 |
+ public static $RouteInfo; // The RouteInfo objcet if the route was matched |
|
13 |
+ |
|
14 |
+ public function __construct() |
|
15 |
+ { |
|
16 |
+ //if(!isset(self::$_instance)) self::$_instance = new self; |
|
17 |
+ if(!isset(self::$routes)) self::$routes = array(); |
|
18 |
+ if(!isset(self::$routeNameIndex)) self::$routeNameIndex= array(); |
|
19 |
+ } |
|
20 |
+ |
|
21 |
+ public static function add($Method, $Path, $Result, $Name = ''){ |
|
22 |
+ self::$routes[] = new RouteInfo($Method, $Path, $Result, $Name); |
|
23 |
+ if(isset($Name)&&$Name!='') self::$routeNameIndex[$Name] = &self::$routes[count(self::$routes)-1]; |
|
24 |
+ return new self; |
|
25 |
+ } |
|
26 |
+ |
|
27 |
+ public static function get($Path, $Result, $Name = ''){ |
|
28 |
+ return self::add('GET', $Path, $Result, $Name); |
|
29 |
+ } |
|
30 |
+ |
|
31 |
+ public static function post($Path, $Result, $Name = ''){ |
|
32 |
+ return self::add('POST', $Path, $Result, $Name); |
|
33 |
+ } |
|
34 |
+ |
|
35 |
+ public static function put($Path, $Result, $Name = ''){ |
|
36 |
+ return self::add('PUT', $Path, $Result, $Name); |
|
37 |
+ } |
|
38 |
+ |
|
39 |
+ public static function patch($Path, $Result, $Name = ''){ |
|
40 |
+ return self::add('PATCH', $Path, $Result, $Name); |
|
41 |
+ } |
|
42 |
+ |
|
43 |
+ public static function delete($Path, $Result, $Name = ''){ |
|
44 |
+ return self::add('DELETE', $Path, $Result, $Name); |
|
45 |
+ } |
|
46 |
+ |
|
47 |
+ public static function any($Path, $Result, $Name = ''){ |
|
48 |
+ return self::add('ANY', $Path, $Result, $Name); |
|
49 |
+ } |
|
50 |
+ |
|
51 |
+ public static function AddBeforeAction($event_handler){ |
|
52 |
+ self::$routes[count(self::$routes)-1]->AddBeforeAction($event_handler); |
|
53 |
+ return new self; |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ public static function AddAfterAction($event_handler){ |
|
57 |
+ self::$routes[count(self::$routes)-1]->AddAfterAction($event_handler); |
|
58 |
+ return new self; |
|
59 |
+ } |
|
60 |
+ |
|
61 |
+ public static function AddAfterResult($event_handler){ |
|
62 |
+ self::$routes[count(self::$routes)-1]->AddAfterAction($event_handler); |
|
63 |
+ return new self; |
|
64 |
+ } |
|
65 |
+ |
|
66 |
+ public static function match($Request){ |
|
67 |
+ |
|
68 |
+ $auri = explode('/', trim($Request->Path, "/ \t\n\r\0\x0B")); |
|
69 |
+ $curi = count($auri); |
|
70 |
+ |
|
71 |
+ foreach (self::$routes as $routeInfo) { |
|
72 |
+ |
|
73 |
+ $route = $routeInfo->Path; |
|
74 |
+ $method = $routeInfo->Method; |
|
75 |
+ if($method=='ANY' || strpos($Request->Method,$method)!==false){ |
|
76 |
+ $aroute = explode('/', trim($route, "/ \t\n\r\0\x0B")); |
|
77 |
+ //print_r($aroute); |
|
78 |
+ if($curi==count($aroute)){ //compare path element count |
|
79 |
+ //optimistic assumption :) |
|
80 |
+ $matchResult = true; |
|
81 |
+ for($i = 0; $i<$curi; $i++){ |
|
82 |
+ $pathPartName = trim($aroute[$i],'{}'); |
|
83 |
+ if($aroute[$i]==$pathPartName){ |
|
84 |
+ if($auri[$i]!=$pathPartName){ |
|
85 |
+ //echo "diffrence found"; |
|
86 |
+ $matchResult = false; |
|
87 |
+ break; |
|
88 |
+ } |
|
89 |
+ } |
|
90 |
+ else{ // {...} found -> catch $uri variable |
|
91 |
+ $value = $auri[$i]; |
|
92 |
+ $valueKey = explode(':', $pathPartName); |
|
93 |
+ //validation |
|
94 |
+ if(isset($valueKey[1]) && $valueKey[1]=='int'){ |
|
95 |
+ $value = intval($value); |
|
96 |
+ } |
|
97 |
+ //value store... |
|
98 |
+ self::$parsedParameters[$valueKey[0]] = $value; |
|
99 |
+ } |
|
100 |
+ } |
|
101 |
+ if($matchResult){ // match found |
|
102 |
+ self::$depth = $curi; |
|
103 |
+ self::$RouteInfo = $routeInfo; |
|
104 |
+ return $routeInfo->Result; |
|
105 |
+ } |
|
106 |
+ } |
|
107 |
+ } |
|
108 |
+ } |
|
109 |
+ return false; |
|
110 |
+ } |
|
111 |
+ |
|
112 |
+ public static function link($name, $parameters){ |
|
113 |
+ $route = self::$routeNameIndex[$name]; |
|
114 |
+ $fields = array_keys($parameters); |
|
115 |
+ $values = array_values($parameters); |
|
116 |
+ array_walk($fields, function (&$item, $key){ |
|
117 |
+ $item = "/\{".$item."\}/"; |
|
118 |
+ }); |
|
119 |
+ return preg_replace($fields, $values, $route->Path); |
|
120 |
+ } |
|
121 |
+ |
|
122 |
+ public function __get($name) |
|
123 |
+ { |
|
124 |
+ if($name=="routes") return self::$routes; |
|
125 |
+ if($name=="parsedParameters") return self::$parsedParameters; |
|
126 |
+ if($name=="depth") return self::$depth; |
|
127 |
+ if($name=="RouteInfo") return self::$RouteInfo; |
|
128 |
+ } |
|
129 |
+ |
|
130 |
+ public function __call($name, $arguments) |
|
131 |
+ { |
|
132 |
+ if($name == 'GetParameter'){ |
|
133 |
+ return self::$parsedParameters[$arguments[0]]; |
|
134 |
+ } |
|
135 |
+ // Note: value of $name is case sensitive. |
|
136 |
+ $allowed_methods = ['add', 'post', 'any', 'get', 'match', 'AddBeforeAction', 'AddAfterAction', 'AddAfterResult']; |
|
137 |
+ |
|
138 |
+ if(in_array($name, $allowed_methods)){ |
|
139 |
+ $the_method = new \ReflectionMethod($this, $name); |
|
140 |
+ $the_method->invokeArgs(NULL,$arguments); |
|
141 |
+ } |
|
142 |
+ else{ |
|
143 |
+ throw new \Exception("Call undefined or inaccesible method ".get_class($this)."::$name"); |
|
144 |
+ } |
|
145 |
+ |
|
146 |
+ } |
|
147 |
+ |
|
148 |
+} |
|
0 | 149 |
\ No newline at end of file |