You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 10 KiB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. ![apic](http://webtools.qiniudn.com/master-LOGO-20150410_50.jpg)
  2. ##[PhalApi(π框架) - V1.3.6](http://www.phalapi.net)
  3. PhalApi,简称π框架,是一个PHP轻量级开源接口框架,专注于接口开发,致力让接口开发更简单。它:
  4. + 致力于快速、稳定、持续交付有价值的接口服务
  5. + 关注于测试驱动开发、领域驱动设计、极限编程、敏捷开发
  6. + 有众多的扩展类库,与更多开源项目一起提供高效便捷的解决方案
  7. + 支持HTTP、SOAP和RPC协议,可用于快速搭建微服务、RESTful接口或Web Services
  8. PhalApi代码开源、产品开源、思想开源,请放心使用。更多请访问[www.phalapi.net](http://www.phalapi.net)。再次感谢**开源中国**、各位贡献者和同学。
  9. ###导读
  10. 本文内容主要分为三部分,即:
  11. + PART 1:安装、在线体验与在线接口文档
  12. + PART 2:快速开发、单元测试、目录结构、SDK包和Library扩展类库
  13. + PART 3:背景回顾、贡献者、许可与更新日记
  14. 更多请访问[在线文档](http://www.phalapi.net/wikis/)。
  15. ##1-1、安装
  16. + 请从release分支拉取发布版本的代码
  17. + 推荐部署于Linux服务器
  18. + 建议PHP >= 5.3.3
  19. 将代码下载解压到服务器后,打开浏览器,访问安装向导(推荐使用nginx,并将根目录设置为```Public```):
  20. ```
  21. http://localhost/PhalApi/Public/install/
  22. ```
  23. ![](http://7xiz2f.com1.z0.glb.clouddn.com/QQ20151024155002.jpg)
  24. 访问默认接口服务,验证是否安装成功:
  25. ```
  26. http://localhost/PhalApi/Public/demo/
  27. ```
  28. ![](http://webtools.qiniudn.com/20150211_default_index.jpg)
  29. 更多其他创建项目的方式,请访问[创建一个自己的项目](http://www.phalapi.net/wikis/%5B1.2%5D-%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7%B1%E7%9A%84%E9%A1%B9%E7%9B%AE.html)。
  30. ###框架升级与框架共享
  31. 我们会尽最大的努力保证完美兼容性的升级。当框架有新版本需要升级时,只需要简单一步:更新替换```./PhalApi/PhalApi```核心框架目录即可。
  32. 如果需要多个项目共享使用PhalApi框架,可以把```./PhalApi/PhalApi```移到任何位置,然后对应修改```./PhalApi/Public/init.php```文件中引入路径即可(但会导致部分脚本命令不可用)。如:
  33. ```
  34. require_once API_ROOT . '/path/to/PhalApi/PhalApi.php';
  35. ```
  36. ##1-2、在线体验
  37. 1、默认的接口服务:
  38. ```
  39. http://demo.phalapi.net/
  40. ```
  41. 2、带参数的示例接口:
  42. ```
  43. http://demo.phalapi.net/?service=Default.Index&username=oschina
  44. {
  45. "ret": 200,
  46. "data": {
  47. "title": "Hello World!",
  48. "content": "oschina您好,欢迎使用PhalApi!",
  49. "version": "1.3.4",
  50. "time": 1473863280
  51. },
  52. "msg": ""
  53. }
  54. ```
  55. 3、故意请求一个非法的服务:
  56. ```
  57. http://demo.phalapi.net/?service=Demo.None
  58. {
  59. "ret": 400,
  60. "data": [],
  61. "msg": "非法请求:服务Demo.None不存在"
  62. }
  63. ```
  64. ##1-3、在线接口文档(自动生成)
  65. 按框架指定的格式完成接口代码编写后,PhalApi会自动生成在线接口列表文档和在线接口详情文档,以方便客户端实时查看最新的接口签名和返回字段。
  66. 1、在线接口列表文档
  67. 访问对应项目路径下的```listAllApis.php```可查看此项目下全部的接口服务,如访问:
  68. ```
  69. http://demo.phalapi.net/listAllApis.php
  70. ```
  71. ![](http://7xiz2f.com1.z0.glb.clouddn.com/QQ20160914230528.jpg)
  72. 2、在线接口详情文档
  73. 访问对应项目路径下的```checkApiParams.php```,并传递```?service=xxx.xxx```参数即可查看具体的接口文档,如访问:
  74. ```
  75. http://demo.phalapi.net/checkApiParams.php?service=Default.Index
  76. ```
  77. ![mahua](http://7xiz2f.com1.z0.glb.clouddn.com/index20160728224002.jpg)
  78. ##2-1、快速开发
  79. 1、编写一个Hello World!接口
  80. 以下代码需要放置到接口类文件```./Demo/Api/Welcome.php```中:
  81. ```
  82. <?php
  83. class Api_Welcome extends PhalApi_Api {
  84. public function say() {
  85. $rs = array();
  86. $rs['title'] = 'Hello World!';
  87. return $rs;
  88. }
  89. }
  90. ```
  91. 2、访问接口
  92. 接口访问的格式为:```接口域名 + 入口路径 + ?service=XXX.XXX```,此示例中对应的链接为:
  93. ```
  94. http://localhost/Public/demo/?service=Welcome.Say
  95. ```
  96. 3、接口返回
  97. 结果默认以JSON格式返回,即:
  98. ```
  99. {"ret":200,"data":{"title":"Hello World!"},"msg":""}
  100. ```
  101. 4、运行截图
  102. ![](http://webtools.qiniudn.com/20150111.jpg)
  103. ##2-2、接口单元测试
  104. _不能被测试的代码,不是好代码。_
  105. 在使用此框架进行接口开发时,我们强烈建议使用测试驱动开发(TDD),以便于不断积累形成接口测试体系,保证接口向前向后兼容。例如对接口```/?service=User.GetBaseInfo&userId=1```进行单元测试时,按:**构造-操作-检验(BUILD-OPERATE-CHECK)模式**,即:
  106. ```
  107. /**
  108. * @group testGetBaseInfo
  109. */
  110. public function testGetBaseInfo()
  111. {
  112. //Step 1. 构建请求URL
  113. $str = 'service=User.GetBaseInfo&userId=1';
  114. //Step 2. 执行请求(模拟接口请求)
  115. $rs = PhalApi_Helper_TestRunner::go($url);
  116. //Step 3. 验证
  117. $this->assertNotEmpty($rs);
  118. $this->assertArrayHasKey('code', $rs);
  119. $this->assertArrayHasKey('msg', $rs);
  120. $this->assertArrayHasKey('info', $rs);
  121. $this->assertEquals(0, $rs['code']);
  122. $this->assertEquals('dogstar', $rs['info']['name']);
  123. $this->assertEquals('oschina', $rs['info']['from']);
  124. }
  125. ```
  126. 运行效果:
  127. ![运行效果](http://static.oschina.net/uploads/space/2015/0204/234130_GSJ6_256338.png)
  128. 对于框架的核心代码,我们也一直坚持着单元测试,其核心框架代码的单元测试覆盖率可高达96%以上。
  129. ##2-3、主要目录结构
  130. ```
  131. .
  132. ├── PhalApi //PhalApi框架,后期可以整包升级
  133. ├── Library //PhalApi扩展类库,可根据需要自由添加扩展
  134. ├── SDK //PhalApi提供的SDK包,客户可根据需要选用
  135. ├── Public //对外访问目录,建议隐藏PHP实现
  136. │ └── demo //Demo服务访问入口
  137. ├── Config //项目接口公共配置,主要有:app.php, sys.php, dbs.php
  138. ├── Data //项目接口公共数据
  139. ├── Language //项目接口公共翻译
  140. ├── Runtime //项目接口运行文件目录,用于存放日记,可软链到别的区
  141. └── Demo //应用接口服务,名称自取,可多组
  142. ├── Api //接口响应层
  143. ├── Domain //接口领域层
  144. ├── Model //接口持久层
  145. └── Tests //接口单元测试
  146. ```
  147. 以下为一示例目录结构图解:
  148. ![](http://7qnay5.com1.z0.glb.clouddn.com/QQ-20151015214456.jpg)
  149. ##2-4、基于接口查询语言(ASL)的SDK包支持
  150. 目前已提供的SDK有:
  151. + [JAVA版](http://www.phalapi.net/wikis/%5B6.2%5D-SDK%E5%8C%85%EF%BC%88JAVA%E7%89%88%EF%BC%89.html)
  152. + [Objective-c版](http://www.phalapi.net/wikis/%5B6.4%5D-SDK%E5%8C%85%EF%BC%88object-c%E7%89%88%EF%BC%89.html)
  153. + [PHP版](http://www.phalapi.net/wikis/%5B6.3%5D-SDK%E5%8C%85%EF%BC%88PHP%E7%89%88%EF%BC%89.html)
  154. + C#版
  155. + JS版
  156. + Golang版
  157. + React-Native版
  158. + [Ruby版](http://www.phalapi.net/wikis/%5B6.6%5D-SDK%E5%8C%85%EF%BC%88Ruby%E7%89%88%EF%BC%89.html)
  159. 基于接口查询语言,可用一句话来描述接口请求,如JAVA的请求示例:
  160. ```
  161. PhalApiClientResponse response = PhalApiClient.create()
  162. .withHost("http://demo.phalapi.net/")
  163. .withService("Default.Index") //接口服务
  164. .withParams("username", "dogstar") //接口参数
  165. .withTimeout(3000) //接口超时
  166. .request();
  167. ```
  168. ##2-5、PhalApi-Library扩展类库
  169. PhalApi框架扩展类库,致力于与开源项目一起提供高效便捷的解决方案,更多请查看:[PhalApi-Library](http://git.oschina.net/dogstar/PhalApi-Library)。
  170. ##3-1、背景回顾
  171. 过去十年,是互联网时代;如今的十年,是移动时代。
  172. 在iOS、Android、Windows Phone、PC版、Web版等各种终端和各种垂直应用不停更新迭代的大背景下,显然很是需要一组乃至一系列稳定的后台接口支撑。接口,显然是如此重要,正如Jaroslav Tulach在《软件框架设计的艺术》一书中说的:_API就如同恒星,一旦出现,便与我们永恒共存。_
  173. 所以,这里希望通过提供一个快速可用的后台接口开发框架,可以:
  174. + 一来,支撑轻量级项目后台接口的快速开发;
  175. + 二来,阐明如何进行接口开发、设计和维护,以很好支持海量访问、大数据、向前向后兼容等;
  176. + 三来,顺便分享一些好的思想、技巧和有用的工具、最佳实践。
  177. 如果您有接口项目开发的需要,又刚好需要一个PHP接口框架,欢迎使用!我们也致力于将PhalApi维护成像恒星一样:**不断更新,保持生气;为接口负责,为开源负责!**
  178. ##3-2、加入我们
  179. 显然,这只是一个开始,我们要走的路还很长。PhalApi是我们(开发团队)的框架,更是我们(所有人)的框架。在一个人还年轻的时候,我觉得,就应该着手致力做一些对社会有意义的事情,一如开源。欢迎&期待你的加入!
  180. 在加入前,可先查看[致框架贡献者:加入PhalApi开源指南](http://www.phalapi.net/wikis/%5B5.8%5D-%E8%87%B4%E6%A1%86%E6%9E%B6%E8%B4%A1%E7%8C%AE%E8%80%85%EF%BC%9A%E5%8A%A0%E5%85%A5PhalApi%E5%BC%80%E6%BA%90%E6%8C%87%E5%8D%97.html)。至此,感谢以下贡献者(排名不分先后):
  181. + Aevit
  182. + dogstar
  183. + George
  184. + Scott
  185. + Summer
  186. + zz.guo(郭了个治浩)
  187. + 小艾
  188. + 大蝉
  189. + 冰霜
  190. + 火柴
  191. + 黄苗笋
  192. + 文振熙(喵了个咪)
  193. + 爱编程的小逗比
  194. + ... ...
  195. ##3-3、许可
  196. PhalApi是开源框架,承诺永远免费,使用GPL协议,更多请访问[许可](http://www.phalapi.net/license)。
  197. ##3-4、更新日记
  198. 此 [更新日记](http://www.phalapi.net/wikis/%5B5.6%5D-%E6%9B%B4%E6%96%B0%E6%97%A5%E8%AE%B0.html) ,主要是为了说明,我们一直在努力更新和维护。