接口版本号

框架默认占用v1版本号,当您对调用的接口需要进行二次开发时,我们建议不要直接修改公共模块内的成员函数,
而是另起一个版本号,将框架与二次开发所修改的内容区分开。

下面将举例说明如何进行新增、修改、删除。

管理控制器类

  1. app/api/controller目录下新建v2目录,也可以自主设计目录名称,例如叫“ver2.0”,但名称在 URL 访问与命名空间时必须一致(演示讲解时一律使用v2名称)。

  2. 之后在v2目录下创建控制器类文件,如果是在某个控制器类的基础上进行二次开发,那么二者的文件名称必须一致,并且继承于对应的v1控制器类。 如果是一个完全独立、新增的控制器类,那么必须继承于\app\api\controller\CareyShop

演示代码片段

完成上面的操作后就可以实际写入代码,演示代码以v1版本下的Index控制器为例,对各种会运用到的状况都做了解释。

  1. <?php
  2. /**
  3. * @copyright Copyright (c) http://careyshop.cn All rights reserved.
  4. *
  5. * CareyShop 自定义接口版本号v2演示
  6. *
  7. * @author zxm <252404501@qq.com>
  8. * @date 2020/10/10
  9. */
  10. namespace app\api\controller\v2;
  11. use app\careyshop\service\Index as IndexService;
  12. class Index extends \app\api\controller\v1\Index
  13. {
  14. /**
  15. * 方法1:通过方法路由器
  16. * 重写该成员函数,通过"self::$route"键名对应的值来改变请求方法的重定位
  17. * 如果需要继承父类"self::$route"的初始值,则需要执行"parent::initMethod()"
  18. * 不执行状态下,v1与v2属于完全独立的请求接口
  19. *
  20. * 如果选择不继承初始值,那么建议当前类从"\app\api\controller\CareyShop.php"继承
  21. * 而不是从"\app\api\controller\v1\Index"继承
  22. *
  23. * @access protected
  24. * @return void
  25. */
  26. protected static function initMethod()
  27. {
  28. /**
  29. * 父类"self::$route"的初始值
  30. * self::$route = [
  31. * // API访问测试
  32. * 'get.index.host' => ['getIndexHost', false],
  33. * // 清空所有缓存
  34. * 'clear.cache.all' => ['clearCacheAll', IndexService::class],
  35. * // 调整最优状态(正式环境有效)
  36. * 'set.system.optimize' => ['setSystemOptimize', IndexService::class],
  37. * // 获取系统版本号
  38. * 'get.system.version' => ['getVersion', IndexService::class],
  39. * ];
  40. */
  41. parent::initMethod();
  42. // 父方法路由器键名不存在"get.system.v2"方法,表示新增一个接口
  43. self::$route['get.system.v2'] = ['getMethodV2', false];
  44. // 父方法路由器键名存在"get.system.version"方法,表示修改一个接口
  45. self::$route['get.system.version'] = ['getVersion', false];
  46. // 删除从父方法路由器继承过来的"set.system.optimize"方法
  47. unset(self::$route['set.system.optimize']);
  48. /**
  49. * 假设不执行"parent::initMethod()",那么"Index"控制器最终请求方法结果如下:
  50. * "get.index.host"与"clear.cache.all" v1、v2都不可请求
  51. * "set.system.optimize" v1可请求,v2不可请求
  52. * "get.system.version" v1、v2都可请求,但返回内容不同
  53. * "get.system.v2" v1不可请求,v2可请求
  54. * 至于方法路由器中的键值含义请参考 https://doc.careyshop.cn/guide/controller/
  55. */
  56. /**
  57. * 假设执行过"parent::initMethod()",那么"Index"控制器最终请求方法结果如下:
  58. * "get.index.host"与"clear.cache.all" v1、v2都可请求,且结果相同
  59. * "set.system.optimize" v1可请求,v2不可请求
  60. * "get.system.version" v1、v2都可请求,但返回内容不同
  61. * "get.system.v2" v1不可请求,v2可请求
  62. * 至于方法路由器中的键值含义请参考 https://doc.careyshop.cn/guide/controller/
  63. */
  64. }
  65. /**
  66. * 方法2:通过自定义初始化
  67. * 重写该成员函数,与方法1的区别是重写该成员函数不需要执行"parent::initMethod()"
  68. * 默认状态下就已经继承父类"self::$route"的初始值
  69. *
  70. * @access protected
  71. * @return void
  72. */
  73. protected static function init()
  74. {
  75. // 父方法路由器键名不存在"get.system.v2"方法,表示新增一个接口
  76. // self::$route['get.system.v2'] = ['getMethodV2', false];
  77. // 父方法路由器键名存在"get.system.version"方法,表示修改一个接口
  78. // self::$route['get.system.version'] = ['getVersion', false];
  79. // 删除从父方法路由器继承过来的"set.system.optimize"方法
  80. // unset(self::$route['set.system.optimize']);
  81. /**
  82. * 假设上方注释的代码段完成执行,那么"Index"控制器最终请求方法结果如下:
  83. * "get.index.host"与"clear.cache.all" v1、v2都可请求,且结果相同
  84. * "set.system.optimize" v1可请求,v2不可请求
  85. * "get.system.version" v1、v2都可请求,但返回内容不同
  86. * "get.system.v2" v1不可请求,v2可请求
  87. * 至于方法路由器中的键值含义请参考 https://doc.careyshop.cn/guide/controller/
  88. */
  89. }
  90. /**
  91. * 假设请求条件同为 "method": "get.system.v2"时,
  92. * 访问 http://{{host}}/v1/index 会提示错误,原因是v1版本下不存在此接口
  93. * 访问 http://{{host}}/v2/index 会正确返回执行结果
  94. *
  95. * @access public
  96. * @return string
  97. */
  98. public function getMethodV2()
  99. {
  100. return '基于CareyShop商城框架系统,新增v2接口数据返回';
  101. }
  102. /**
  103. * 假设请求条件同为 "method": "get.system.version"时,
  104. * 访问 http://{{host}}/v1/index 返回:
  105. * {"status":200,"message":"success","data":{"version":"1.3.0"}}
  106. * 访问 http://{{host}}/v2/index 返回:
  107. * {"status":200,"message":"success","data":{"version":"1.3.0","v2":"基于CareyShop商城框架系统,修改为v2接口后数据返回"}}
  108. *
  109. * @access public
  110. * @return array
  111. */
  112. public function getVersion()
  113. {
  114. $indexService = new IndexService();
  115. $data = $indexService->getVersion();
  116. $data['v2'] = '基于CareyShop商城框架系统,修改为v2接口后数据返回';
  117. return $data;
  118. }
  119. }

备注: 在示例中方法路由器的具体使用可以查阅,接口控制器