loader->addDirs($apiDirName); $files = listDir(API_ROOT . D_S . $apiDirName. D_S . 'Api'); // 追加处理扩展类库 foreach ($libraryPaths as $aPath) { $toAddDir = str_replace('/', D_S, $aPath); DI()->loader->addDirs($toAddDir); $toListDir = API_ROOT . D_S . $toAddDir . D_S . 'Api'; $aLibFiles = listDir($toListDir); $files = array_merge($files, $aLibFiles); } // 待排除的方法 $allPhalApiApiMethods = get_class_methods('PhalApi_Api'); // 扫描接口文件 $allApiS = array(); $errorMessage = ''; foreach ($files as $value) { $value = realpath($value); $subValue = substr($value, strpos($value, D_S . 'Api' . D_S) + 1); //支持多层嵌套,不限级 $arr = explode(D_S, $subValue); $subValue = implode(D_S, $arr); $apiServer = str_replace(array(D_S, '.php'), array('_', ''), $subValue); $apiServerShortName = substr($apiServer, 4); if (!class_exists($apiServer)) { continue; } // 检测文件路径的合法性 if (ucfirst(substr($apiServer, 4)) != substr($apiServer, 4)) { $errorMessage .= $apiServer . ' 类文件首字母必须大写!
'; } // 左菜单的标题 $ref = new ReflectionClass($apiServer); $title = "//请检测接口服务注释($apiServer)"; $desc = '//请使用@desc 注释'; $docComment = $ref->getDocComment(); if ($docComment !== false) { $docCommentArr = explode("\n", $docComment); $comment = trim($docCommentArr[1]); $title = trim(substr($comment, strpos($comment, '*') + 1)); foreach ($docCommentArr as $comment) { $pos = stripos($comment, '@desc'); if ($pos !== false) { $desc = substr($comment, $pos + 5); } } } $allApiS[$apiServerShortName]['title'] = $title; $allApiS[$apiServerShortName]['desc'] = $desc; $method = array_diff(get_class_methods($apiServer), $allPhalApiApiMethods); sort($method); foreach ($method as $mValue) { $rMethod = new Reflectionmethod($apiServer, $mValue); if (!$rMethod->isPublic() || strpos($mValue, '__') === 0) { continue; } $title = '//请检测函数注释'; $desc = '//请使用@desc 注释'; $docComment = $rMethod->getDocComment(); if ($docComment !== false) { $docCommentArr = explode("\n", $docComment); $comment = trim($docCommentArr[1]); $title = trim(substr($comment, strpos($comment, '*') + 1)); foreach ($docCommentArr as $comment) { $pos = stripos($comment, '@desc'); if ($pos !== false) { $desc = substr($comment, $pos + 5); } } } $service = $apiServerShortName . '.' . ucfirst($mValue); $allApiS[$apiServerShortName]['methods'][$service] = array( 'service' => $service, 'title' => $title, 'desc' => $desc, ); } } // 运行模式 $env = (PHP_SAPI == 'cli') ? TRUE : FALSE; $webRoot = ''; if ($env) { $trace = debug_backtrace(); $listFilePath = $trace[0]['file']; $webRoot = substr($listFilePath, 0, strrpos($listFilePath, D_S)); } // 主题风格,fold = 折叠,expand = 展开 $theme = isset($_GET['type']) ? $_GET['type'] : 'fold'; global $argv; if ($env) { $theme = isset($argv[1]) ? $argv[1] : 'fold'; } if (!in_array($theme, array('fold', 'expand'))) { $theme = 'fold'; } //echo json_encode($allApiS) ; //字典排列 ksort($allApiS); $projectName = $this->projectName; include dirname(__FILE__) . '/api_list_tpl.php'; } } function listDir($dir) { $dir .= substr($dir, -1) == D_S ? '' : D_S; $dirInfo = array(); foreach (glob($dir . '*') as $v) { if (is_dir($v)) { $dirInfo = array_merge($dirInfo, listDir($v)); } else { $dirInfo[] = $v; } } return $dirInfo; } function saveHtml($webRoot, $name, $string){ $dir = $webRoot . D_S . 'doc'; if (!is_dir ( $dir)){ mkdir ( $dir); } $handle = fopen ( $dir . DIRECTORY_SEPARATOR . $name . '.html', 'wb'); fwrite ( $handle, $string); fclose ( $handle); }