... | ... |
@@ -11,19 +11,26 @@ class RouteInfo{ |
11 | 11 |
public $result; |
12 | 12 |
// The route name |
13 | 13 |
public $name; |
14 |
+ // The type the route - should be one of defined in the class constants |
|
15 |
+ public $type; |
|
14 | 16 |
// BeforeAction event handlers; |
15 | 17 |
public $beforeAction; |
16 | 18 |
// AfterAction event handlers; |
17 | 19 |
public $afterAction; |
18 | 20 |
// AfterResult event handlers; |
19 | 21 |
public $afterResult; |
22 |
+ |
|
23 |
+ //RouteInfo types: |
|
24 |
+ public const L3 = "L3"; |
|
25 |
+ public const REGEX = "REGEX"; |
|
20 | 26 |
|
21 |
- public function __construct($method, $path, $result, $name = '') |
|
27 |
+ public function __construct($method, $path, $result, $name = '', $type = self::L3) |
|
22 | 28 |
{ |
23 | 29 |
$this->path = $path; |
24 | 30 |
$this->method = $method; |
25 | 31 |
$this->result = $result; |
26 | 32 |
$this->name = $name; |
33 |
+ $this->type = $type; |
|
27 | 34 |
$this->beforeAction = array(); |
28 | 35 |
$this->afterAction = array(); |
29 | 36 |
$this->afterResult = array(); |
... | ... |
@@ -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){ |