123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- <?php namespace System;
- class Router {
-
- public $request;
-
- public $routes;
-
- public function __construct($method, $uri, $routes = null)
- {
-
-
- $this->request = $method.' /'.trim($uri, '/');
- $this->routes = (is_array($routes)) ? $routes : $this->load($uri);
- }
-
- public static function make($method, $uri, $routes = null)
- {
- return new static($method, $uri, $routes);
- }
-
- public function load($uri)
- {
- $base = require APP_PATH.'routes'.EXT;
- if ( ! is_dir(APP_PATH.'routes') or $uri == '')
- {
- return $base;
- }
- list($routes, $segments) = array(array(), explode('/', $uri));
- foreach (array_reverse($segments, true) as $key => $value)
- {
- if (file_exists($path = ROUTE_PATH.implode('/', array_slice($segments, 0, $key + 1)).EXT))
- {
- $routes = require $path;
- }
- }
- return array_merge($routes, $base);
- }
-
- public function route()
- {
- if (isset($this->routes[$this->request]))
- {
- return Request::$route = new Route($this->request, $this->routes[$this->request]);
- }
- foreach ($this->routes as $keys => $callback)
- {
-
-
- if (strpos($keys, '(') !== false or strpos($keys, ',') !== false )
- {
- foreach (explode(', ', $keys) as $key)
- {
- if (preg_match('#^'.$this->translate_wildcards($key).'$#', $this->request))
- {
- return Request::$route = new Route($keys, $callback, $this->parameters($this->request, $key));
- }
- }
- }
- }
- }
-
- private function translate_wildcards($key)
- {
- $replacements = 0;
-
-
-
- $key = str_replace(array('/(:num?)', '/(:any?)'), array('(?:/([0-9]+)', '(?:/([a-zA-Z0-9\-_]+)'), $key, $replacements);
- $key .= ($replacements > 0) ? str_repeat(')?', $replacements) : '';
- return str_replace(array(':num', ':any'), array('[0-9]+', '[a-zA-Z0-9\-_]+'), $key);
- }
-
- private function parameters($uri, $route)
- {
- return array_values(array_intersect_key(explode('/', $uri), preg_grep('/\(.+\)/', explode('/', $route))));
- }
- }
|