Example #1
0
 /**
  * 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();
 }