/** * Runs the callback for the given request */ public static function run() { $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $method = $_SERVER['REQUEST_METHOD']; $searches = array_keys(static::$patterns); $replaces = array_values(static::$patterns); self::$routes = str_replace('//', '/', self::$routes); $found_route = false; $query = ''; $q_arr = array(); if (strpos($uri, '&') > 0) { $query = substr($uri, strpos($uri, '&') + 1); $uri = substr($uri, 0, strpos($uri, '&')); $q_arr = explode('&', $query); foreach ($q_arr as $q) { $qobj = explode('=', $q); $q_arr[] = array($qobj[0] => $qobj[1]); if (!isset($_GET[$qobj[0]])) { $_GET[$qobj[0]] = $qobj[1]; } } } // check if route is defined without regex if (in_array($uri, self::$routes)) { $route_pos = array_keys(self::$routes, $uri); // foreach route position foreach ($route_pos as $route) { if (self::$methods[$route] == $method || self::$methods[$route] == 'ANY') { $found_route = true; //if route is not an object if (!is_object(self::$callbacks[$route])) { //call object controller and method self::invokeObject(self::$callbacks[$route]); if (self::$halts) { return; } } else { //call closure call_user_func(self::$callbacks[$route]); if (self::$halts) { return; } } } } // end foreach } else { // check if defined with regex $pos = 0; // foreach routes foreach (self::$routes as $route) { $route = str_replace('//', '/', $route); if (strpos($route, ':') !== false) { $route = str_replace($searches, $replaces, $route); } if (preg_match('#^' . $route . '$#', $uri, $matched)) { if (self::$methods[$pos] == $method || self::$methods[$pos] == 'ANY') { $found_route = true; //remove $matched[0] as [1] is the first parameter. array_shift($matched); if (!is_object(self::$callbacks[$pos])) { //call object controller and method self::invokeObject(self::$callbacks[$pos], $matched); if (self::$halts) { return; } } else { //call closure call_user_func_array(self::$callbacks[$pos], $matched); if (self::$halts) { return; } } } } $pos++; } // end foreach } // run the error callback if the route was not found if (!$found_route) { if (!self::$error_callback) { self::$error_callback = function () { self::invokeObject('Core\\Error@index'); }; } if (!is_object(self::$error_callback)) { //call object controller and method self::invokeObject(self::$error_callback, null, 'No routes found.'); if (self::$halts) { return; } } else { call_user_func(self::$error_callback); if (self::$halts) { return; } } } }
/** * Runs the callback for the given request */ public static function dispatch() { $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $method = $_SERVER['REQUEST_METHOD']; $searches = array_keys(static::$patterns); $replaces = array_values(static::$patterns); $found_route = false; self::$routes = str_replace('//', '/', self::$routes); // Check if route is defined without regex if (in_array($uri, self::$routes)) { $route_pos = array_keys(self::$routes, $uri); foreach ($route_pos as $route) { // Using an ANY option to match both GET and POST requests if (self::$methods[$route] === $method || self::$methods[$route] === 'ANY') { $found_route = true; // If route is not an object if (!is_object(self::$callbacks[$route])) { // Grab all parts based on a / separator $parts = explode('/', self::$callbacks[$route]); // Collect the last index of the array $last = end($parts); // Grab the controller name and method call $segments = explode('@', $last); // Instanitate controller $controller = new $segments[0](); // Call method $controller->{$segments[1]}(); if (self::$halts) { return; } } else { // Call closure call_user_func(self::$callbacks[$route]); if (self::$halts) { return; } } } } } else { // Check if defined with regex $pos = 0; foreach (self::$routes as $route) { if (strpos($route, ':') !== false) { $route = str_replace($searches, $replaces, $route); } if (preg_match('#^' . $route . '$#', $uri, $matched)) { if (self::$methods[$pos] === $method || self::$methods[$pos] === 'ANY') { $found_route = true; // Remove $matched[0] as [1] is the first parameter. array_shift($matched); if (!is_object(self::$callbacks[$pos])) { // Grab all parts based on a / separator $parts = explode('/', self::$callbacks[$pos]); // Collect the last index of the array $last = end($parts); // Grab the controller name and method call $segments = explode('@', $last); // Instanitate controller $controller = new $segments[0](); // Fix multi parameters if (!method_exists($controller, $segments[1])) { //"controller and action not found" Debugger::report(500); } else { call_user_func_array(array($controller, $segments[1]), $matched); } if (self::$halts) { return; } } else { call_user_func_array(self::$callbacks[$pos], $matched); if (self::$halts) { return; } } } } $pos++; } } // Run the error callback if the route was not found if ($found_route === false) { if (!self::$error_callback) { self::$error_callback = function () { Debugger::report(404); }; } else { if (is_string(self::$error_callback)) { self::get($_SERVER['REQUEST_URI'], self::$error_callback); self::$error_callback = null; self::dispatch(); return; } } call_user_func(self::$error_callback); } }