| <?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'; | 
|     } | 
| } |