ILIAS  release_4-3 Revision
 All Data Structures Namespaces Files Functions Variables Groups Pages
Route.php
Go to the documentation of this file.
1 <?php
40 class Slim_Route {
41 
45  protected $pattern;
46 
50  protected $callable;
51 
55  protected $conditions = array();
56 
60  protected static $defaultConditions = array();
61 
65  protected $name;
66 
70  protected $params = array();
71 
75  protected $methods = array();
76 
80  protected $router;
81 
85  protected $middleware = array();
86 
92  public function __construct( $pattern, $callable ) {
93  $this->setPattern($pattern);
94  $this->setCallable($callable);
95  $this->setConditions(self::getDefaultConditions());
96  }
97 
103  public static function setDefaultConditions( array $defaultConditions ) {
104  self::$defaultConditions = $defaultConditions;
105  }
106 
111  public static function getDefaultConditions() {
113  }
114 
119  public function getPattern() {
120  return $this->pattern;
121  }
122 
128  public function setPattern( $pattern ) {
129  $this->pattern = str_replace(')', ')?', (string)$pattern);
130  }
131 
136  public function getCallable() {
137  return $this->callable;
138  }
139 
145  public function setCallable($callable) {
146  $this->callable = $callable;
147  }
148 
153  public function getConditions() {
154  return $this->conditions;
155  }
156 
162  public function setConditions( array $conditions ) {
163  $this->conditions = $conditions;
164  }
165 
170  public function getName() {
171  return $this->name;
172  }
173 
179  public function setName( $name ) {
180  $this->name = (string)$name;
181  $this->router->cacheNamedRoute($this->name, $this);
182  }
183 
188  public function getParams() {
189  return $this->params;
190  }
191 
196  public function setHttpMethods() {
197  $args = func_get_args();
198  $this->methods = $args;
199  }
200 
205  public function getHttpMethods() {
206  return $this->methods;
207  }
208 
213  public function appendHttpMethods() {
214  $args = func_get_args();
215  $this->methods = array_merge($this->methods, $args);
216  }
217 
222  public function via() {
223  $args = func_get_args();
224  $this->methods = array_merge($this->methods, $args);
225  return $this;
226  }
227 
232  public function supportsHttpMethod( $method ) {
233  return in_array($method, $this->methods);
234  }
235 
240  public function getRouter() {
241  return $this->router;
242  }
243 
249  public function setRouter( Slim_Router $router ) {
250  $this->router = $router;
251  }
252 
257  public function getMiddleware() {
258  return $this->middleware;
259  }
260 
276  public function setMiddleware( $middleware ) {
277  if ( is_callable($middleware) ) {
278  $this->middleware[] = $middleware;
279  } else if ( is_array($middleware) ) {
280  $this->middleware = array_merge($this->middleware, $middleware);
281  } else {
282  throw new InvalidArgumentException('Route middleware must be callable or an array of callables');
283  }
284  return $this;
285  }
286 
298  public function matches( $resourceUri ) {
299  //Extract URL params
300  preg_match_all('@:([\w]+)@', $this->pattern, $paramNames, PREG_PATTERN_ORDER);
301  $paramNames = $paramNames[0];
302 
303  //Convert URL params into regex patterns, construct a regex for this route
304  $patternAsRegex = preg_replace_callback('@:[\w]+@', array($this, 'convertPatternToRegex'), $this->pattern);
305  if ( substr($this->pattern, -1) === '/' ) {
306  $patternAsRegex = $patternAsRegex . '?';
307  }
308  $patternAsRegex = '@^' . $patternAsRegex . '$@';
309 
310  //Cache URL params' names and values if this route matches the current HTTP request
311  if ( preg_match($patternAsRegex, $resourceUri, $paramValues) ) {
312  array_shift($paramValues);
313  foreach ( $paramNames as $index => $value ) {
314  $val = substr($value, 1);
315  if ( isset($paramValues[$val]) ) {
316  $this->params[$val] = urldecode($paramValues[$val]);
317  }
318  }
319  return true;
320  } else {
321  return false;
322  }
323  }
324 
330  protected function convertPatternToRegex( $matches ) {
331  $key = str_replace(':', '', $matches[0]);
332  if ( array_key_exists($key, $this->conditions) ) {
333  return '(?P<' . $key . '>' . $this->conditions[$key] . ')';
334  } else {
335  return '(?P<' . $key . '>[a-zA-Z0-9_\-\.\!\~\*\\\'\(\)\:\@\&\=\$\+,%]+)';
336  }
337  }
338 
344  public function name( $name ) {
345  $this->setName($name);
346  return $this;
347  }
348 
354  public function conditions( array $conditions ) {
355  $this->conditions = array_merge($this->conditions, $conditions);
356  return $this;
357  }
358 
380  public function dispatch() {
381  if ( substr($this->pattern, -1) === '/' && substr($this->router->getRequest()->getResourceUri(), -1) !== '/' ) {
382  throw new Slim_Exception_RequestSlash();
383  }
384  //Invoke middleware
385  foreach ( $this->middleware as $mw ) {
386  if ( is_callable($mw) ) {
387  call_user_func($mw);
388  }
389  }
390  //Invoke callable
391  if ( is_callable($this->getCallable()) ) {
392  call_user_func_array($this->callable, array_values($this->params));
393  return true;
394  }
395  return false;
396  }
397 
398 }