注意:文档已迁移至以下地址,本文将不再维护

GitHub地址:https://github.com/HGthecode/thinkphp-apidoc 文档地址:https://hgthecode.github.io/thinkphp-apidoc/ 示例地址:https://apidoc.demo.hg-code.com/apidoc/

控制器中的每一个符合注释规则的方法都会被解析成一个API接口

参数说明

书写参数时有如下几个规范

  • 每个参数书写在一行
  • 每个参数以 @+参数名,用空格 与参数值隔开 如 * [@参数名](#) 参数值 | 参数名 | 参数值 | 说明 | 书写规范 | | —- | —- | —- | —- | | title | | 接口名称 | 任意字符串 | | desc | | 接口说明 | 任意字符串 | | author | | 作者 | 任意字符串 | | url | | 真实的接口URL | 任意字符串 | | method | GET | POST | PUT | DELETE | 请求类型 | 指定的字符串 | | tag | | 接口Tag标签 | 多个标签用 空格隔开 | | header | | 请求头Headers参数 | 可定义多个,每个一行,每个属性用空格隔开 | | |— name | | 参数的字段名 | 如:name:Authorization | | |— require | | 是否必填 | 1=必填 | | |— default | | 默认值 | | | |— desc | | 字段说明文字 | | | param / return | | 请求参数 / 响应结果 | 可定义多个,每个一行,每个属性用空格隔开 | | |— name | | 参数字段名 | 如:name:username,如直接使用ref引入某个定义,可不配置name | | |— type | int | string | … 等 | 字段类型 | | | |— require | | 是否必填 | 1=必填 | | |— default | | 默认值 | | | |— desc | | 字段说明文字 | | | |— ref | | 引入定义的路径,可引入全局定义、server方法类、模型方法 | 如:ref:definitions\pagingParam
    或:ref:app\servers\ApiTest\get
    或:ref:app\model\Apps\getList | | |— field | | 当ref配置为引入模型字段时,用field来指定引入的字段 | 如:field:id,username,nickname
    则只会引入模型的 id,username,nickname字段 | | |— withoutField | | 当ref配置为引入模型字段时,用withoutField来指定过滤掉的字段 | 如:withoutField:id,username,nickname
    则引入模型除 id,username,nickname字段外的所有字段 | | |— params | | 字段为一个对象或一个数组 | 如:params:id:int 1 唯一id,name:string 0 姓名 |

基础注释

我们在控制器中加入如下方法,如下

  1. <?php
  2. namespace app\controller;
  3. /**
  4. * @title Api接口文档测试
  5. * @desc 测试一些注释的解析能力
  6. */
  7. class ApiTest
  8. {
  9. /**
  10. * @title 基础的注释方法
  11. * @desc 一个很基础的接口注释解析能力
  12. * @author HG
  13. * @url /api/test
  14. * @method GET
  15. * @tag 测试 基础
  16. * @header name:Authorization require:1 default: desc:Token
  17. * @param name:username type:string require:1 default: desc:用户名
  18. * @param name:password type:string require:1 default: desc:登录密码MD5
  19. * @param name:phone type:string require:1 default: desc:手机号
  20. * @param name:sex type:int require:0 default:0 desc:性别
  21. *
  22. * @return name:id type:int desc:新增用户的id
  23. */
  24. public function test(){
  25. return returnSuccess(["id"=>1]);
  26. }
  27. }

我们得到的效果如下
image.png

引入定义

通过定义通用的参数来实现 可复用性,避免每个接口都定义一大堆同样的参数

增加配置

首先,在配置文件 config/apidoc.php 配置文件中,配置以下参数,指定一个控制器为定义公共注释的控制器

  1. // 指定公共注释定义的文件地址
  2. 'definitions'=>"app\controller\Definitions",

定义通用注释

添加一些通用的方法及注释,(定义param 与return 参数与定义接口书写规则一致)

  1. <?php
  2. namespace app\controller;
  3. class Definitions
  4. {
  5. /**
  6. * @title 获取分页数据列表
  7. * @param name:pageIndex type:int require:0 default:0 desc:查询页数
  8. * @param name:pageSize type:int require:0 default:20 desc:查询条数
  9. */
  10. public function pagingParam(){}
  11. /**
  12. * @title 返回字典数据
  13. * @author HG
  14. * @return name:id type:int desc:唯一id
  15. * @return name:name type:string desc:字典名
  16. * @return name:value type:string desc:字典值
  17. */
  18. public function dictionary(){}
  19. }

使用定义

在接口注释中的 param 与 retrun 可通过ref:definitions\XXX来指定引入的 通用注释

  1. <?php
  2. namespace app\controller;
  3. /**
  4. * @title Api接口文档测试
  5. * @desc 测试一些注释的解析能力
  6. */
  7. class ApiTest
  8. {
  9. /**
  10. * @title 引入定义注释
  11. * @desc 引入定义文件所定义的通用参数来
  12. * @author HG
  13. * @url /api/definitions
  14. * @method GET
  15. * @param name:page type:object ref:definitions\pagingParam desc:分页参数
  16. * @param ref:definitions\pagingParam
  17. * @return name:list type:array ref:definitions\dictionary
  18. */
  19. public function test(){
  20. return returnSuccess(["id"=>1]);
  21. }
  22. }

效果如下:
image.png

以上param用了两种方式引入,分别是参数指定 字段名 name与 type ,与不指定字段名

  • 指定字段名:会将引入的参数在该字段属性下,如下效果
  • 不指定字段名:直接引入所有参数

引入逻辑层定义的参数

在实际开发中,控制器只对参数做基础校验等处理,实际的业务逻辑处理通常会分层给 server 来处理(我这里把业务逻辑层叫server,您也可以根据自己开发来定义 业务逻辑层),我们可直接引入业务逻辑层的注释来实现接口参数的定义

定义业务逻辑层

1、在项目 app 目录下新建 server 文件夹(您也可以叫别的)
2、在此文件夹下新建一个ApiDoc.php文件,内容如下:

  1. <?php
  2. namespace app\servers;
  3. class ApiDoc
  4. {
  5. /**
  6. * @title 返回会员信息
  7. * @param name:id type:int require:1 desc:唯一id
  8. * @return name:id type:int desc:唯一id
  9. * @return name:name type:string desc:姓名
  10. * @return name:phone type:string desc:电话
  11. */
  12. public function getUserInfo(){}
  13. /**
  14. * @title 返回会员列表
  15. * @return ref:app\model\User\getList
  16. */
  17. public function getUserList(){}
  18. }

使用定义

在接口注释中的 param 与 retrun 可通过ref:app\servers\ApiDoc\getUserInfo来指定引入逻辑层的注释

  1. <?php
  2. namespace app\controller;
  3. /**
  4. * @title Api接口文档测试
  5. * @desc 测试一些注释的解析能力
  6. */
  7. class ApiTest
  8. {
  9. /**
  10. * @title 引入逻辑层定义注释
  11. * @desc 引入业务逻辑层的注释参数
  12. * @author HG
  13. * @url /api/server
  14. * @method GET
  15. * @param ref:app\servers\ApiDoc\getUserInfo
  16. * @return name:userInfo type:object ref:app\servers\ApiDoc\getUserInfo
  17. * @return name:userList type:array ref:app\servers\ApiDoc\getUserList
  18. */
  19. public function test(){
  20. ...
  21. }
  22. }

效果如下:
image.png

以上param请求参数直接引入了逻辑层定义的参数,return返回结果,引入逻辑层的两种方式返回,

  • 直接返回逻辑层定义的参数
  • 逻辑层也可以直接再引入模型的数据表字段注释,从而减少注释量

引入模型的数据表字段定义

接口参数都与数据表息息相关,很多接口参数均由数据表字段而来。我们可以直接引入指定模型的数据表字段来生成参数说明,省去了一大堆接口注释与维护工作。

使用引入

可直接在接口注释、逻辑层方法注释的 param 与return 中使用ref引入
1、接口注释中引入示例

  1. <?php
  2. namespace app\controller;
  3. /**
  4. * @title Api接口文档测试
  5. * @desc 测试一些注释的解析能力
  6. */
  7. class ApiTest
  8. {
  9. /**
  10. * @title 引入模型数据表字段
  11. * @desc 引入模型数据表的字段与注释参数来实现字段过滤
  12. * @author HG
  13. * @url /api/model
  14. * @method GET
  15. * @param name:id type:int require:1 desc:唯一id
  16. * @return name:userInfo type:object ref:app\model\User\getInfo desc:用户信息
  17. */
  18. public function test(){
  19. ...
  20. }
  21. }

效果如下:
image.png

模型方法的注释

可为引入的数据模型方法添加相应注释来实现 field(返回指定字段)、withoutField(排除指定字段)、addField(添加指定字段)

参数 说明 书写规范
field 返回指定字段 英文格式逗号 , 分开指定的字段
withoutField 排除指定字段 英文格式逗号 , 分开指定的字段
addField 添加指定字段 可定义多个,每行为一个参数
|— name 参数的字段名 如:name:group_name
|— type 字段类型 int | string | … 等
|— default 默认值 默认值
|— desc 字段说明文字 字段说明文字
  1. <?php
  2. namespace app\model;
  3. class User extends BaseModel
  4. {
  5. /**
  6. * @title 根据id获取明细
  7. * @field id,username,nickname,state,sex
  8. * @addField name:group_name type:string desc:会员组名称
  9. * @addField name:role_name type:string desc:角色名称
  10. */
  11. public function getInfo($id){
  12. $res = $this->get($id);
  13. return $res;
  14. }
  15. }

效果如下:
image.png

给数据表添加注释

建议为数据表字段添加注释,即让数据表字段可读性更高,也让文档可读性更高。
我们直接在数据表给相应字段添加注释,如下SQL供参考

  1. CREATE TABLE `user` (↵
  2. `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',↵
  3. `username` varchar(64) NOT NULL COMMENT '用户名',↵
  4. `nickname` varchar(64) DEFAULT NULL COMMENT '昵称',↵
  5. `password` char(64) NOT NULL COMMENT '登录密码',↵
  6. `regip` bigint(11) NOT NULL COMMENT '注册IP',↵
  7. `state` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',↵
  8. `phone` char(32) DEFAULT NULL COMMENT '联系电话',↵
  9. `create_time` int(10) DEFAULT NULL COMMENT '创建时间',↵
  10. `login_num` int(11) unsigned DEFAULT NULL COMMENT '登录次数',↵
  11. `sex` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '性别',↵
  12. `delete_time` int(10) DEFAULT NULL,↵
  13. `role` varchar(64) DEFAULT NULL COMMENT '角色',↵
  14. `name` varchar(64) DEFAULT NULL COMMENT '姓名',↵
  15. PRIMARY KEY (`id`)↵) ENGINE=MyISAM AUTO_INCREMENT=23 DEFAULT CHARSET=utf8"