From 60f69659ea3b95b4677d8e150c82d5ac59efe90e Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Wed, 27 Jul 2011 12:02:11 -0500 Subject: [PATCH] Added Router::call method for making HMVC requests. --- system/router.php | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/system/router.php b/system/router.php index e7328759..71c09dee 100644 --- a/system/router.php +++ b/system/router.php @@ -3,11 +3,27 @@ class Router { /** - * All of the loaded routes. + * All of the loaded routes keyed by route file. * * @var array */ - public static $routes; + private static $routes = array(); + + /** + * Simulate a request to a given route. Useful for implementing HMVC. + * + * @param array|string $parameters + * @return Response + */ + public static function call($parameters) + { + $route = static::route('GET', (is_array($parameters)) ? implode('/', $parameters) : (string) $parameters); + + if ( ! is_null($route)) + { + return $route->call(); + } + } /** * Search a set of routes for the route matching a method and URI. @@ -18,22 +34,19 @@ class Router { */ public static function route($method, $uri) { - if (is_null(static::$routes)) - { - static::$routes = static::load($uri); - } + $routes = static::load($uri); // Put the request method and URI in route form. // Routes begin with the request method and a forward slash. $uri = $method.' /'.trim($uri, '/'); // Is there an exact match for the request? - if (isset(static::$routes[$uri])) + if (isset($routes[$uri])) { - return Request::$route = new Route($uri, static::$routes[$uri]); + return Request::$route = new Route($uri, $routes[$uri]); } - foreach (static::$routes as $keys => $callback) + foreach ($routes as $keys => $callback) { // Only check routes that have multiple URIs or wildcards. // Other routes would have been caught by the check for literal matches. @@ -58,7 +71,7 @@ public static function route($method, $uri) */ public static function load($uri) { - $base = require APP_PATH.'routes'.EXT; + $base = (isset(static::$routes[$path = APP_PATH.'routes'.EXT])) ? static::$routes[$path] : static::$routes[$path] = require $path; return (is_dir(APP_PATH.'routes') and $uri !== '') ? array_merge(static::load_from_directory($uri), $base) : $base; } @@ -77,9 +90,13 @@ private static function load_from_directory($uri) // Iterate backwards through the URI looking for the deepest matching file. foreach (array_reverse($segments, true) as $key => $value) { - if (file_exists($path = APP_PATH.'routes/'.implode('/', array_slice($segments, 0, $key + 1)).EXT)) + if (isset(static::$routes[$path = ROUTE_PATH.implode('/', array_slice($segments, 0, $key + 1)).EXT])) { - return require $path; + return static::$routes[$path]; + } + elseif (file_exists($path)) + { + return static::$routes[$path] = require $path; } }