<?php
|
/**
|
* PhalApi_Helper_ApiDesc - 在线接口描述查看 - 辅助类
|
*
|
* @package PhalApi\Helper
|
* @license http://www.phalapi.net/license GPL 协议
|
* @link http://www.phalapi.net/
|
* @author dogstar <chanzonghuang@gmail.com> 2015-05-30
|
*/
|
|
class PhalApi_Helper_ApiDesc extends PhalApi_Helper_ApiOnline {
|
|
public function render() {
|
$service = DI()->request->getService();
|
|
$rules = array();
|
$returns = array();
|
$description = '';
|
$descComment = '//请使用@desc 注释';
|
$exceptions = array();
|
|
try {
|
$api = PhalApi_ApiFactory::generateService(FALSE);
|
$rules = $api->getApiRules();
|
} catch (PhalApi_Exception $ex){
|
$service .= ' - ' . $ex->getMessage();
|
include dirname(__FILE__) . '/api_desc_tpl.php';
|
return;
|
}
|
|
list($className, $methodName) = explode('.', $service);
|
$className = 'Api_' . $className;
|
|
// 整合需要的类注释,包括父类注释
|
$rClass = new ReflectionClass($className);
|
$classDocComment = $rClass->getDocComment();
|
while ($parent = $rClass->getParentClass()) {
|
if ($parent->getName() == 'PhalApi_Api') {
|
break;
|
}
|
$classDocComment = $parent->getDocComment() . "\n" . $classDocComment;
|
$rClass = $parent;
|
}
|
$needClassDocComment = '';
|
foreach (explode("\n", $classDocComment) as $comment) {
|
if (stripos($comment, '@exception') !== FALSE
|
|| stripos($comment, '@return') !== FALSE) {
|
$needClassDocComment .= "\n" . $comment;
|
}
|
}
|
|
// 方法注释
|
$rMethod = new ReflectionMethod($className, $methodName);
|
$docCommentArr = explode("\n", $needClassDocComment . "\n" . $rMethod->getDocComment());
|
|
foreach ($docCommentArr as $comment) {
|
$comment = trim($comment);
|
|
//标题描述
|
if (empty($description) && strpos($comment, '@') === FALSE && strpos($comment, '/') === FALSE) {
|
$description = substr($comment, strpos($comment, '*') + 1);
|
continue;
|
}
|
|
//@desc注释
|
$pos = stripos($comment, '@desc');
|
if ($pos !== FALSE) {
|
$descComment = substr($comment, $pos + 5);
|
continue;
|
}
|
|
//@exception注释
|
$pos = stripos($comment, '@exception');
|
if ($pos !== FALSE) {
|
$exArr = explode(' ', trim(substr($comment, $pos + 10)));
|
$exceptions[$exArr[0]] = $exArr;
|
continue;
|
}
|
|
//@return注释
|
$pos = stripos($comment, '@return');
|
if ($pos === FALSE) {
|
continue;
|
}
|
|
$returnCommentArr = explode(' ', substr($comment, $pos + 8));
|
//将数组中的空值过滤掉,同时将需要展示的值返回
|
$returnCommentArr = array_values(array_filter($returnCommentArr));
|
if (count($returnCommentArr) < 2) {
|
continue;
|
}
|
if (!isset($returnCommentArr[2])) {
|
$returnCommentArr[2] = ''; //可选的字段说明
|
} else {
|
//兼容处理有空格的注释
|
$returnCommentArr[2] = implode(' ', array_slice($returnCommentArr, 2));
|
}
|
|
//以返回字段为key,保证覆盖
|
$returns[$returnCommentArr[1]] = $returnCommentArr;
|
}
|
|
$projectName = $this->projectName;
|
|
include dirname(__FILE__) . '/api_desc_tpl.php';
|
}
|
}
|