public static function serve($query_string = false, $method = null, $payload = null, $check_perms = true) { if ($query_string) { self::$mode = self::MODE_EXECUTE; self::$query_string = $query_string; self::$method = is_null($method) ? request_method() : $method; //The payload must be specified, either through the query string or in the payload itself... self::$payload = $payload; } else { self::$mode = self::MODE_REQUEST; self::$query_string = $_SERVER['QUERY_STRING']; self::$method = is_null($method) ? request_method() : $method; ///Payload is always set with _GET / _POST with requests switch (self::$method) { case 'GET': self::$payload = array_map('stripslashes_deep', $_GET); break; case 'POST': //Add GET variables as well. Should POST overwrites GET vars self::$payload = array_map('stripslashes_deep', $_GET); self::$payload = array_merge(self::$payload, array_map('stripslashes_deep', $_POST)); break; } } self::$check_perms = $check_perms; self::$ob_level = ob_get_level(); parse_str(self::$query_string, self::$query_vars); if (empty(self::$payload) && !is_array(self::$payload)) { self::$payload = array(); } //Make sure that all of query string vars is in the payload. if (self::$mode == self::MODE_EXECUTE && self::$method == 'GET') { self::$payload = array_merge(self::$query_vars, self::$payload); } self::init(); self::start(); list($controller, $result) = self::action(); if ($controller instanceof AreaCtl) { self::display($controller, $result); } if (self::$mode == self::MODE_EXECUTE) { self::finish(); } }