/** * Dispatch a callback * * @param object $route a route stdObject * @return void **/ private static function dispatchRoute($route) { if (!preg_match($route->url->pattern, self::$request_path, $matches)) { if (self::$restless_urls) { $rev = strrev(self::$request_path); $try_path = $rev[0] == '/' ? substr(self::$request_path, 0, -1) : self::$request_path . '/'; if (preg_match($route->url->pattern, $try_path)) { $new_location = !empty($_SERVER['PATH_INFO']) ? self::$active_proxy_uri . $try_path : $try_path; header('Location: ' . $new_location, TRUE, 301); exit; } } return FALSE; } self::$messages[] = 'Match. Request path ' . self::$request_path . ' matched URL definition "' . $route->url->scalar . '"'; foreach ($matches as $name => $param) { if (is_string($name)) { $_GET[$name] = urldecode($param); } } $callback_string = self::injectParamsIntoCallback($route->callback); self::$messages[] = 'Generated Callback: ' . $callback_string; self::$active_callback = $callback_string; // dispatch closure if ($route->function instanceof Closure) { self::$active_function = $callback_string; self::$messages[] = 'Calling assigned closure'; call_user_func(self::compat($route->function)); exit; // dispatch function } else { if (function_exists($callback_string)) { // disallow dangerous functions if (preg_match('/^[\\*_\\\\]+$/', $route->callback->finder)) { self::$messages[] = 'Skipping callback ' . $callback_string . ': Callback definition is dangerous.'; self::triggerContinue(); } $function = new ReflectionFunction($callback_string); if (method_exists($function, 'getNamespaceName')) { self::$active_namespace = $function->getNamespaceName(); } self::$active_function = $callback_string; self::$messages[] = 'Calling function: ' . $callback_string; call_user_func($callback_string); exit; // dispatch method } else { self::validateMethodCallback($callback_string); $method = new ReflectionMethod($callback_string); $class = self::compat($callback_string); $class = $class[0]; $parsed_class = self::parseClass($class); self::$active_method = $callback_string; self::$active_short_method = $method->getName(); self::$active_class = $class; self::$active_short_class = $parsed_class['short_class']; self::$active_namespace = $parsed_class['namespace']; if ($method->isStatic()) { self::$messages[] = 'Calling static method: ' . $callback_string; call_user_func(self::compat($callback_string)); exit; } else { self::$messages[] = 'Instantiating class for ' . $callback_string; new $class(); exit; } } } self::$messages[] = 'Skipping callback: ' . $callback_string . '. Not a valid method or function.'; self::triggerContinue(); }