/** * 实例化一个模型 * @param type $classname_path * @param type $hmvc_module_floder * @return type CoreModel */ public static function instance($classname_path = null, $hmvc_module_floder = NULL) { if (!empty($hmvc_module_floder)) { CoreRouter::switchHmvcConfig($hmvc_module_floder); } //这里调用控制器instance是为了触发自动加载,从而避免了插件模式下,直接instance模型,自动加载失效的问题 CoreController::instance(); if (empty($classname_path)) { $renew = is_bool($classname_path) && $classname_path === true; CoreLoader::classAutoloadRegister(); return empty(self::$instance) || $renew ? self::$instance = new self() : self::$instance; } $system = CoreLoader::$system; $classname_path = str_replace('.', DIRECTORY_SEPARATOR, $classname_path); $classname = basename($classname_path); $model_folders = $system['model_folder']; if (!is_array($model_folders)) { $model_folders = array($model_folders); } $count = count($model_folders); CoreLoader::classAutoloadRegister(); foreach ($model_folders as $key => $model_folder) { $filepath = $model_folder . DIRECTORY_SEPARATOR . $classname_path . $system['model_file_suffix']; $alias_name = $classname; if (isset(CoreModelLoader::$model_files[$alias_name])) { return CoreModelLoader::$model_files[$alias_name]; } if (file_exists($filepath)) { //在plugin模式下,路由器不再使用,那么自动注册不会被执行,自动加载功能会失效,所以在这里再尝试加载一次, //如此一来就能满足两种模式 //CoreLoader::classAutoloadRegister(); if (!class_exists($classname, FALSE)) { CoreLoader::includeOnce($filepath); } if (class_exists($classname, FALSE)) { return CoreModelLoader::$model_files[$alias_name] = new $classname(); } else { if ($key == $count - 1) { Fn::trigger404('Model Class:' . $classname . ' not found.'); } } } else { if ($key == $count - 1) { Fn::trigger404($filepath . ' not found.'); } } } }
/** * 获取视图绝对路径,在视图中include其它视图的时候用到。 * 提示: * hvmc模式,“视图路经数组”是模块的视图数组和主配置视图数组合并后的数组。 * 即:$hmvc_system['view_folder']=array_merge($hmvc_system['view_folder'], $system['view_folder']); * @param type $view_name 视图名称,不含后缀 * @param type $path_key 就是配置中“视图路经数组”的键 * @return string */ public static function view_path($view_name, $path_key = 0) { if (stripos($view_name, ':') !== false) { $info = explode(':', $view_name); $path_key = current($info); $view_name = next($info); } $system = CoreLoader::$system; if (!is_array($system['view_folder'])) { $system['view_folder'] = array($system['view_folder']); } if (!isset($system['view_folder'][$path_key])) { Fn::trigger404('error key[' . $path_key . '] of ' . $system['view_folder']); } $dir = $system['view_folder'][$path_key]; $view_path = $dir . DIRECTORY_SEPARATOR . $view_name . $system['view_file_suffix']; return Fn::truepath($view_path); }
private static function getQueryStr() { $system = CoreLoader::$system; // 命令行运行检查 if (CoreInput::isCli()) { global $argv; $pathinfo_query = isset($argv[1]) ? $argv[1] : ''; } else { $pathinfo = @parse_url($_SERVER['REQUEST_URI']); if (empty($pathinfo)) { if ($system['debug']) { Fn::trigger404('request parse error:' . $_SERVER['REQUEST_URI']); } else { Fn::trigger404(); } } // pathinfo模式下有?,那么$pathinfo['query']也是非空的,这个时候查询字符串是PATH_INFO和query $query_str = empty($pathinfo['query']) ? '' : $pathinfo['query']; $pathinfo_query = empty($_SERVER['PATH_INFO']) ? $query_str : $_SERVER['PATH_INFO'] . '&' . $query_str; } if ($pathinfo_query) { $pathinfo_query = trim($pathinfo_query, '/&'); } // urldecode 解码所有的参数名,解决get表单会编码参数名称的问题 $pq = $_pq = array(); $_pq = explode('&', $pathinfo_query); foreach ($_pq as $value) { $p = explode('=', $value); if (isset($p[0])) { $p[0] = urldecode($p[0]); } $pq[] = implode('=', $p); } $pathinfo_query = implode('&', $pq); return $pathinfo_query; }
/** * 实例化一个控制器 * @staticvar array $loadedClasses * @param type $classname_path * @param type $hmvc_module_floder * @return CoreController */ public static function instance($classname_path = null, $hmvc_module_floder = NULL) { if (!empty($hmvc_module_floder)) { CoreRouter::switchHmvcConfig($hmvc_module_floder); } if (empty($classname_path)) { CoreLoader::classAutoloadRegister(); return new self(); } $system = CoreLoader::$system; $classname_path = str_replace('.', DIRECTORY_SEPARATOR, $classname_path); $classname = basename($classname_path); $filepath = $system['controller_folder'] . DIRECTORY_SEPARATOR . $classname_path . $system['controller_file_suffix']; $alias_name = strtolower($classname); static $loadedClasses = array(); if (isset($loadedClasses[$alias_name])) { return $loadedClasses[$alias_name]; } if (file_exists($filepath)) { //在plugin模式下,路由器不再使用,那么自动注册不会被执行,自动加载功能会失效,所以在这里再尝试加载一次, //如此一来就能满足两种模式 CoreLoader::classAutoloadRegister(); CoreLoader::includeOnce($filepath); if (class_exists($classname, FALSE)) { return $loadedClasses[$alias_name] = new $classname(); } else { Fn::trigger404('Ccontroller Class:' . $classname . ' not found.'); } } else { Fn::trigger404($filepath . ' not found.'); } }