function map() { $url = url::strip_query(server::get('request_uri')); $url = str_replace(rtrim(c::get('router.root'), '/'), '', $url); $method = r::method(); foreach (self::$routes as $key => $route) { if (!in_array($method, $route['methods'])) { continue; } $key = str_replace(')', ')?', $key); $args = array(); $regex = preg_replace_callback('#@([\\w]+)(:([^/\\(\\)]*))?#', function ($matches) use(&$args) { $args[$matches[1]] = null; if (isset($matches[3])) { return '(?P<' . $matches[1] . '>' . $matches[3] . ')'; } return '(?P<' . $matches[1] . '>[^/\\?]+)'; }, $key); if (preg_match('#^' . $regex . '(?:\\?.*)?$#i', $url, $matches)) { foreach ($args as $k => $v) { self::$params[$k] = array_key_exists($k, $matches) ? urldecode($matches[$k]) : null; } return $route['callback']; } } return false; }
/** * Iterate through every route to find a matching route. * * @param string $path Optional path to match against * @return Route */ public function run($path = null) { $method = r::method(); $ajax = r::ajax(); $https = r::ssl(); $routes = a::get($this->routes, $method, array()); // detect path if not set manually if ($path === null) { $path = implode('/', (array) url::fragments(detect::path())); } // empty urls should never happen if (empty($path)) { $path = '/'; } foreach ($routes as $route) { if ($route->https and !$https) { continue; } if ($route->ajax and !$ajax) { continue; } // handle exact matches if ($route->pattern == $path) { $this->route = $route; break; } // We only need to check routes with regular expression since all others // would have been able to be matched by the search for literal matches // we just did before we started searching. if (strpos($route->pattern, '(') === false) { continue; } $preg = '#^' . $this->wildcards($route->pattern) . '$#u'; // If we get a match we'll return the route and slice off the first // parameter match, as preg_match sets the first array item to the // full-text match of the pattern. if (preg_match($preg, $path, $parameters)) { $this->route = $route; $this->route->arguments = array_slice($parameters, 1); break; } } if ($this->route and $this->filterer($this->route->filter) !== false) { return $this->route; } else { return null; } }
public function testMethod() { $this->assertEquals('GET', r::method()); }