<?php
|
defined('D_S') || define('D_S', DIRECTORY_SEPARATOR);
|
|
class PhalApi_Helper_ApiList extends PhalApi_Helper_ApiOnline {
|
|
public function render($apiDirName, $libraryPaths) {
|
// 处理项目
|
DI()->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 . ' 类文件首字母必须大写!<br/>';
|
}
|
|
|
// 左菜单的标题
|
$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);
|
}
|