框架改版后的第二个版本定下来了,这两天也比较轻松,于是就折腾给项目建个好看的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文档生成工具相关推荐

  1. 猿创征文|小而巧的API文档生成工具之smart-doc

    文章目录 smart-doc介绍 smart-doc特性 smart-doc的最佳搭档 谁在使用smart-doc smart-doc的优缺点 smart-doc和swagger区别比较 smart- ...

  2. apiDoc 一款很不错api文档生成工具

    apiDoc 一款很不错api文档生成工具,在开发接口的时候,需要给同事看相应的接口文档.给大家推荐一个生成文档的工具--apiDoc,最后生成的文档以网页的形式发布,方便快捷,便于阅读. 创建项目目 ...

  3. 关于深度学习框架Hamaa与Python API文档生成工具Sophon

    五月两场 | NVIDIA DLI 深度学习入门课程 5月19日/5月26日一天密集式学习  快速带你入门阅读全文> 正文共1988个字,预计阅读时间12分钟. 前言 最近三个月我主要花时间在造 ...

  4. springboot的api_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  5. android api文档_【粉丝投稿】无需额外注解的 SpringBoot API文档生成工具

    点击上方"蓝字"关注我们吧! JApiDocs是一个无需额外注解.开箱即用的SpringBoot接口文档生成工具. 编写和维护API文档这个事情,对于后端程序员来说,是一件恼人但又 ...

  6. java smart算法_Java Restful API 文档生成工具 smart-doc

    谁说生成api文档就必须要定义注解? 谁说生成接口请求和返回示例必须要在线? 用代码去探路,不断尝试更多文档交付的可能性. 如果代码有生命,为什么不换种方式和它对话! 一.背景 没有背景.就自己做自己 ...

  7. 一款零注解侵入的 API 文档生成工具,你用过吗?

    以下文章来源方志朋的博客,回复"666"获面试宝典 介绍 smart-doc是一款同时支持JAVA REST API和Apache Dubbo RPC接口文档生成的工具,smart ...

  8. Api文档生成工具与Api文档的传播(pdf)

    点击查看apidoc生成文档demo 1 环境和工具 win10 apidoc:注释生成api文档 wkhtmltopdf:apidoc生成的是html,不适合传播,于是通过wkhtmltopdf将h ...

  9. [aspnetcore.apidoc]一款很不错的api文档生成工具

    简单徐速一下为什么选用了aspnetcore.apidoc 而没有选用swagger 最初我们也有在试用swagger,但总是有些感觉,感觉有点不满意,就但从api文档角度来说,从前后端文档沟通角度来 ...

最新文章

  1. Ubuntu18.04 网络配置
  2. oracle rac standby,oracle RAC数据库建立STANDBY(二)
  3. iOS使用Instruments的工具
  4. 斯坦福大学深度学习公开课cs231n学习笔记(6)神经网路输入数据预处理(归一化,PCA等)及参数初始化
  5. 拓端tecdat|R如何与Tableau集成分步指南 - 适用于数据科学和商业智能专业人员
  6. JavaScript下载本地文件
  7. SQL语言中的连接表
  8. 【工具篇】OBS推流在Bilibli直播平台的设置和应用
  9. 阿里巴巴国际站关键字抓取工具
  10. 弱监督学习综述-周志华(ML论文阅读笔记1)
  11. android使用谷歌插件下载图片,Image Downloader:批量图片下载
  12. set的erase函数
  13. 还记得星球大战里那个圆头圆脑的机器人吗
  14. 如何用cmd打开管理员模式
  15. 1、唯交易的市场不会偏差,2、期权对冲股票市值张数和权利金计算
  16. project2016如何设置日历
  17. ubuntu 19.04 与win10双系统 搜狗输入法安装教程
  18. Vue3+Quasar实现ins风格图片墙
  19. Mac环境下Android一键自动打包发布到蒲公英平台
  20. 服务器 响应400,加载资源失败:服务器响应的状态为400:spring mvc

热门文章

  1. android bp文件_理解Android.bp
  2. 移动端h5图片下载-前端小白初长成
  3. java 重写equals方法的种种“坑”
  4. openCV之waitKey函数简介
  5. 干货 | Web前端优化及工具集锦
  6. HashMap底层源码解析
  7. 微信支付 Verify the signature and get the Wechatpay certificate corresponding to serialnumber[X] is empt
  8. 队列 (Queue)
  9. Anaconda的卸载及安装(图文详解)
  10. PCIE 3.0 4.0 GEN3 GEN4 速度如何