php自写api文档生成工具
框架改版后的第二个版本定下来了,这两天也比较轻松,于是就折腾给项目建个好看的api文档。
各种折腾。先是折腾phpDocumentor2,用phpdoc开源工具来建立文档,好不容易安装成功,各个模板都使用了一遍,还是不满意。后来又发现了swagger文档生成工具,起初看起来还蛮直观的,但是一看注释块,又觉得太繁琐了。
索性,主管拍板,自己写一个api文档生成类,满足自己的需求:体现路由,方法和参数。
自写工具的优点是:高可定制化,满足自己的一切要求,实现自己想要的样式,没有冗余文件
下面是注释块样式:
/*** @description 这里是描述* @router http://www.test.com/api/demo/:id* @method GET* @param string $a* @param string $b* @return number*/
下面是生成的效果 图:
实现代码如下:
/**
* 1.以输入的目录分目录,proxy,user,site
* 2.以@package分文件,site.html,vhost.html
*/
class apiDoc
{
static $round = 1;
static $testArr = array();
static $docPackage = '';
public static function targetApiDir($dir)
{
$apiDir = API_PATH.$dir."/";
self::$docPackage = API_DOC_DIR.$dir;
self::parseApiFile($apiDir);
}
public static function parseApiFile($dir)
{
$arr = scandir($dir);
foreach ($arr as $v) {
if ($v == "." || $v == "..") {
continue;
}
$file = $dir.$v;
$content = file_get_contents($file);
$preg = "/\/\*[\S\s]+?\*\//";
preg_match_all($preg,$content,$rows);
if (!!$rows) {
foreach ($rows[0] as $key=>$row) {
$arr = self::doWithBlocQuote($row);
self::$testArr[$arr['package']][$arr['router']."-".$arr['method']] = $arr;
}
}
}
if (self::unitDocDir(API_DOC_DIR)) {
self::createDocHtml();
}
echo "创建成功";
print_r(self::$testArr);
}
private static function doWithBlocQuote($row)
{
$router = "";
$param = array();
$method = '';
$package = '';
$return = '';
$description = '';
$preg_router = "/@router[\S\s]+?\\n/";
if (preg_match($preg_router, $row)) {
$arr= explode("\n", $row);
foreach ($arr as $a) {
$a = trim($a);
$a = trim($a,"*");
$a = trim($a,"\t");
$a = trim($a,"\n");
if ($a == "/" || !$a) {
continue;
}
$a = preg_replace('/\s(?=\s)/', '\\1', ltrim($a, " "));
$b = explode(" ", $a);
if ($b[0] == "@description" && count($b) >= 2) {
$b[1] = self::contactRemains($b, 2);
$description = $b[1];
}
if ($b[0] =="@package" && count($b) >= 2) {
$package = $b[1];
}
if ($b[0] == "@router") {
$router = $b[1];
}
if ($b[0] =="@method") {
$method = $b[1];
}
if ($b[0] =="@param" && count($b) >= 3) {
$b[3] = self::contactRemains($b, 4);
array_push($param, array("type"=>$b[1],"name"=>$b[2], "description"=>$b[3]));
}
if ($b[0] =="@return") {
$return = $b[1];
}
}
return array(
'description'=>$description,
'package' => $package,
'router' => $router,
'method' => $method,
'param' => $param,
'return' => $return
);
}
}
private static function headHtml($title, $content)
{
$tpl = '
%s
href="/asset/css/layui.css" rel="stylesheet"/>
href="/asset/css/common.css" rel="stylesheet"/>
.layui-form-label, .layui-form-mid, .layui-table th, .layui-table td{padding-bottom:5px;padding-top:5px;}
.layui-form{padding-bottom:10px;margin-bottom:10px;}
%s
© 2013 %s, Inc. All rights reserved.
'; return sprintf($tpl,$title, $content, $title); } private static function createContentHtml($descript, $router, $method, $params) { $paramHtml = ''; if (count($params) > 0) { foreach ($params as $param) { $paramHtml.= sprintf('%s%s%s', $param['name'], $param['type'], $param['description']); } } else { $paramHtml = '无'; } $html = '
描述
%s
路由
%s
方法
%s
参数
参数 | 类型 | 参数说明 |
---|
%s
'; return sprintf($html, $descript, $router, $method, $paramHtml); } private static function createDocHtml() { foreach (self::$testArr as $package=>&$list) { ksort($list); $html = ''; foreach ($list as $k=>$v) { $html.= self::createContentHtml($v['description'], $v['router'], $v['method'], $v['param']); } $webname = sessionGet("web_name"); if (!$webname) { $webname = SystemMod::webName(); } self::createDocTempFile($package, self::headHtml($webname, $html)); } } private static function contactRemains($arr, $remains) { $str = ''; if (count($arr) >= $remains) { $str = ''; for ($i = $remains - 1; $i < count($arr);$i++){ $str.= $arr[$i]; } } return $str; } private static function createDocTempFile($package, $content, $filename = null) { if (!is_dir(self::$docPackage)) { mkdir(self::$docPackage, 775, true); } $newFile = self::$docPackage."/".$package.".html"; file_put_contents($newFile, $content.PHP_EOL, FILE_APPEND); } private static function unitDocDir($dir) { $arr = scandir($dir); foreach ($arr as $v) { if ($v == "." || $v == "..") { continue; } $subDir = $dir."/".$v; if (is_file($subDir)) { unlink($subDir); } else { if (count(scandir($subDir)) > 2) { self::unitDocDir($subDir); } rmdir($subDir); } } return true; } }
以上是上线代码,通过给定api扫描目录生成文档目录,再以定义的package为文件名,生成文档文件。例如;如果文档目录是http://www.test.com/api/demo,则程序会自动扫描demo目录下的所有php文件,并根据注释块解析package, router, method, param,return等内容,如package为demo2,则会生成demo2.html文件,目录为http://www.test.com/doc/demo/demo2.html。
自工作以后,一直都在做工作的事情,也很少用到文本处理函数 。这次写这个工具类,又让我重温了一边文件创建及删除,还是蛮酷的。
php自写api文档生成工具相关推荐
- 猿创征文|小而巧的API文档生成工具之smart-doc
文章目录 smart-doc介绍 smart-doc特性 smart-doc的最佳搭档 谁在使用smart-doc smart-doc的优缺点 smart-doc和swagger区别比较 smart- ...
- apiDoc 一款很不错api文档生成工具
apiDoc 一款很不错api文档生成工具,在开发接口的时候,需要给同事看相应的接口文档.给大家推荐一个生成文档的工具--apiDoc,最后生成的文档以网页的形式发布,方便快捷,便于阅读. 创建项目目 ...
- 关于深度学习框架Hamaa与Python API文档生成工具Sophon
五月两场 | NVIDIA DLI 深度学习入门课程 5月19日/5月26日一天密集式学习 快速带你入门阅读全文> 正文共1988个字,预计阅读时间12分钟. 前言 最近三个月我主要花时间在造 ...
- springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...
- android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具
点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...
- java smart算法_Java Restful API 文档生成工具 smart-doc
谁说生成api文档就必须要定义注解? 谁说生成接口请求和返回示例必须要在线? 用代码去探路,不断尝试更多文档交付的可能性. 如果代码有生命,为什么不换种方式和它对话! 一.背景 没有背景.就自己做自己 ...
- 一款零注解侵入的 API 文档生成工具,你用过吗?
以下文章来源方志朋的博客,回复"666"获面试宝典 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart ...
- Api文档生成工具与Api文档的传播(pdf)
点击查看apidoc生成文档demo 1 环境和工具 win10 apidoc:注释生成api文档 wkhtmltopdf:apidoc生成的是html,不适合传播,于是通过wkhtmltopdf将h ...
- [aspnetcore.apidoc]一款很不错的api文档生成工具
简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger 最初我们也有在试用swagger,但总是有些感觉,感觉有点不满意,就但从api文档角度来说,从前后端文档沟通角度来 ...
最新文章
- Ubuntu18.04 网络配置
- oracle rac standby,oracle RAC数据库建立STANDBY(二)
- iOS使用Instruments的工具
- 斯坦福大学深度学习公开课cs231n学习笔记(6)神经网路输入数据预处理(归一化,PCA等)及参数初始化
- 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
- JavaScript下载本地文件
- SQL语言中的连接表
- 【工具篇】OBS推流在Bilibli直播平台的设置和应用
- 阿里巴巴国际站关键字抓取工具
- 弱监督学习综述-周志华(ML论文阅读笔记1)
- android使用谷歌插件下载图片,Image Downloader:批量图片下载
- set的erase函数
- 还记得星球大战里那个圆头圆脑的机器人吗
- 如何用cmd打开管理员模式
- 1、唯交易的市场不会偏差,2、期权对冲股票市值张数和权利金计算
- project2016如何设置日历
- ubuntu 19.04 与win10双系统 搜狗输入法安装教程
- Vue3+Quasar实现ins风格图片墙
- Mac环境下Android一键自动打包发布到蒲公英平台
- 服务器 响应400,加载资源失败:服务器响应的状态为400:spring mvc
热门文章
- android bp文件_理解Android.bp
- 移动端h5图片下载-前端小白初长成
- java 重写equals方法的种种“坑”
- openCV之waitKey函数简介
- 干货 | Web前端优化及工具集锦
- HashMap底层源码解析
- 微信支付 Verify the signature and get the Wechatpay certificate corresponding to serialnumber[X] is empt
- 队列 (Queue)
- Anaconda的卸载及安装(图文详解)
- PCIE 3.0 4.0 GEN3 GEN4 速度如何