#[PhalApi(π框架) - PHP轻量级开源接口框架 - V1.3.3](http://www.phalapi.net)
PhalApi,简称π框架,专注于接口开发,致力让接口开发更简单。支持HTTP、SOAP和RPC协议,可用于快速搭建微服务、RESTful接口或web services,关注于测试驱动开发、领域驱动设计、极限编程、敏捷开发以及如何快速、稳定、持续交付有价值的接口服务。
在此借一行文字的空间,感谢 **开源中国** 这么好的分享平台,同时也感谢您花费宝贵的时间来阅读此文档,在开源的路上,您每一次真心的关注和肯定都是我们前进的最大动力!谢谢!
此框架代码开源、产品开源、思想开源,可用于个人、商业用途等,请放心使用。更多内容,请访问官网:
![apic](http://webtools.qiniudn.com/master-LOGO-20150410_50.jpg)
#背景
过去十年,是互联网时代;如今的十年,是移动时代。
在iOS、Android、Windows Phone、PC版、Web版等各种终端和各种垂直应用不停更新迭代的大背景下,显然很是需要一组乃至一系列稳定的后台接口支撑。
接口,是如此重要,正如Jaroslav Tulach在《软件框架设计的艺术》一书中说的:
```
API就如同恒星,一旦出现,便与我们永恒共存。
```
所以,这里希望通过提供一个快速可用的后台接口开发框架,可以:
```
一来,支撑轻量级项目后台接口的快速开发;
二来,阐明如何进行接口开发、设计和维护,以很好支持海量访问、大数据、向前向后兼容等;
三来,顺便分享一些好的思想、技巧和有用的工具、最佳实践。
```
如果您有接口项目开发的需要,又刚好需要一个PHP接口框架,欢迎使用! 我们也争取致力于将我们的PhalApi维护成像恒星一样:
```
不断更新,保持生气;为接口负责,为开源负责!
```
#安装
+ *请从release分支拉取稳定的代码*
+ *推荐在Linux服务器上进行开发*
+ *建议PHP >= 5.3.3*
将代码下载解压到服务器后即可,然后打开浏览器,访问安装向导(推荐使用nginx,并将根目录设置为Public):
```
http://localhost/PhalApi/Public/install/
```
![](http://7xiz2f.com1.z0.glb.clouddn.com/QQ20151024155002.jpg)
为验证是否安装成功,可以访问默认接口服务,如:http://localhost/PhalApi/Public/demo/ ,正常时会返回类如:
```
{
"ret": 200,
"data": {
"title": "Default Api",
"content": "PHPer您好,欢迎使用PhalApi!",
"version": "1.1.0",
"time": 1422779027
},
"msg": ""
}
```
#框架升级
我们以最大的努力,保证完美兼容性的升级。当框架有新版本需要升级,只需要简单一步:
```
更新替换 ./PhalApi/PhalApi 核心框架目录即可。
```
#在线体验
```
//默认的接口服务
http://demo.phalapi.net/
//带参数的示例接口
http://demo.phalapi.net/?service=Default.Index&username=oschina
//故意请求一个非法的服务
http://demo.phalapi.net/?service=Demo.None
{
"ret": 400,
"data": [],
"msg": "非法请求:服务Demo.None不存在"
}
```
#文档
[http://www.phalapi.net/wikis/](http://www.phalapi.net/wikis/)
#类参考手册
[http://www.phalapi.net/docs/](http://www.phalapi.net/docs/)
#[酷!]接口参数在线查询
为了方便客户端查看最新的接口参数,特别提供此在线工具,根据接口代码实时生成接口参数报表,完全不需要后台开发编写维护额外的文档。我觉得,这很符合敏捷开发之道。
```
//接口参数在线查询工具链接
http://demo.phalapi.net/demo/checkApiParams.php
```
如:http://demo.phalapi.net/demo/checkApiParams.php ,访问效果如下:
![mahua](http://7qnay5.com1.z0.glb.clouddn.com/20150613.png)
因此,接口所需要的参数,对于接口开发人员,也只是简单配置一下参数规则,便可以轻松获取。
#[赞!]接口单元测试
不能被测试的代码,不是好代码。
在使用此框架进行接口开发时,我们强烈建议使用测试驱动开发,以便于不断积累形成接口测试体系,保证接口向前向后兼容。
例如对接口 **/?service=User.GetBaseInfo&userId=1** 进行单元测试时,按: **构造-操作-检验(BUILD-OPERATE-CHECK)模式** ,即:
```
/**
* @group testGetBaseInfo
*/
public function testGetBaseInfo()
{
//Step 1. 构建请求URL
$str = 'service=User.GetBaseInfo&userId=1';
//Step 2. 执行请求(模拟接口请求)
$rs = PhalApi_Helper_TestRunner::go($url);
//Step 3. 验证
$this->assertNotEmpty($rs);
$this->assertArrayHasKey('code', $rs);
$this->assertArrayHasKey('msg', $rs);
$this->assertArrayHasKey('info', $rs);
$this->assertEquals(0, $rs['code']);
$this->assertEquals('dogstar', $rs['info']['name']);
$this->assertEquals('oschina', $rs['info']['from']);
}
```
运行效果:
![运行效果](http://static.oschina.net/uploads/space/2015/0204/234130_GSJ6_256338.png)
对于框架的核心代码,我们也一直坚持着单元测试,其核心框架代码的单元测试覆盖率可高达96%以上。
#[项!]基于接口查询语言的SDK包支持
可用一句话来描述接口请求,如JAVA的请求示例:
```
PhalApiClientResponse response = PhalApiClient.create()
.withHost("http://demo.phalapi.net/")
.withService("Default.Index") //接口服务
.withParams("username", "dogstar") //接口参数
.withTimeout(3000) //接口超时
.request();
```
目前已提供的SDK有:
+ JAVA版
+ Objective-c版
+ PHP版
+ C#版
+ JS版
#主要目录结构
```
.
│
├── PhalApi //PhalApi框架,后期可以整包升级
│
│
├── Public //对外访问目录,建议隐藏PHP实现
│ └── demo //Demo服务访问入口
│
│
├── Config //项目接口公共配置,主要有:app.php, sys.php, dbs.php
├── Data //项目接口公共数据
├── Language //项目接口公共翻译
├── Runtime //项目接口运行文件目录,用于存放日记,可软链到别的区
│
│
└── Demo //应用接口服务,名称自取,可多组
├── Api //接口响应层
├── Domain //接口领域层
├── Model //接口持久层
└── Tests //接口单元测试
```
以下为一示例目录结构图解
![](http://7qnay5.com1.z0.glb.clouddn.com/QQ-20151015214456.jpg)
#加入我们
显然,这只是一个开始,我们要走的路还很长。这些也不是一个人可以完成的。即使可以,也需要很长一段时间。
在一个人还年轻的时候,我觉得,就应该着手致力做一些对社会有意义的事情,因此我选择了开源。
如果能够有机会和你一起为之努力,将会是我的荣幸,也是一段令值得兴奋激动的。SO?如果你对此深感兴趣、有激情和时间,请联系我,邮箱一如既往是:chanzonghuang@gmail.com,或者开源中国站内留言,欢迎加入,谢谢!
除此之外,你也可以通过其他的方式来支持我们。一如:在你使用此框架进行实际项目开发过程中所遇到的问题或者更好的解决方案都可以反馈给我们;又如:关注和认可,因为在开源的路上,您每一次真心的关注和肯定都是我们前进的最大动力!谢谢!
#更新日记
此 [更新日记](http://www.phalapi.net/wikis/%5B5.6%5D-%E6%9B%B4%E6%96%B0%E6%97%A5%E8%AE%B0.html) ,主要是为了说明,我们一直在努力更新和维护。
- 欢迎使用PhalApi!
- 接口,从简单开始!
- [1.1]-下载与安装
- [1.2]-创建一个自己的项目
- [1.3]-在线体验
- [1.4]-文档、帮助和官网
- [1.10]-对PhalApi框架的抉择
- [1.11]-快速入门(backup)
- [1.12]-参数规则:接口参数规则配置
- [1.13]-统一的接口请求方式:_sevice=XXX.XXX
- [1.14]-统一的返回格式和结构:ret-data-msg
- [1.15]-数据库操作:基于NotORM的使用及优化
- [1.16]-配置读取:内外网环境配置的完美切换
- [1.17]-日记纪录:简化版的日记接口
- [1.18]-快速函数:人性化的关怀
- [1.19]-DI服务速查:各资源服务一览表
- [1.20]-DB操作:数据库基本操作速查
- [1.21]-类的自动加载:遵循PEAR包的命名规范
- [1.22]-签名验证:自定义签名规则
- [1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回
- [1.24]-缓存策略:更灵活地可配置化的多级缓存
- [1.25]-国际化翻译:为走向国际化提前做好翻译准备
- [1.26]-数据安全:数据对称加密方案
- [1.27]-精益开发:更富表现力的Model层和重量级数据获取的应对方案
- [1.28]-COOKIE:对COOKIE原生态的支持及记忆加密升级版
- [1.29]-开放与封闭:多入口和统一初始化
- [1.30]-保持的力量:接口开发最佳实践
- [1.31]-新型计划任务:以接口形式实现的计划任务
- [2.11]-核心思想:DI依赖注入-让资源更可控
- [2.12]-海量数据:可配置的分库分表
- [2.13]-接口调试:在线SQL语句查看与性能优化
- [2.14]-测试驱动开发:意图导向编程下的接口开发
- [2.15]-演进:新型计划任务续篇
- [2.16]-领域驱动设计:应对复杂领域业务的Domain层
- [2.17]-微服务:Api接口服务层
- [2.18]-定制化:资源服务的再实现
- [2.19]-扩展库:可重用的扩展类库
- [2.20]-约定编程:架构明显的编程风格
- [2.21]-服务器统一部署方案简明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益项目和团队建设
- [3.1]-扩展类库:微信开发
- [3.2]-扩展类库:代理模式下phprpc协议的轻松支持
- [3.3]-扩展类库:基于PHPMailer的邮件发送
- [3.4]-扩展类库:优酷开放平台接口调用
- [3.5]-扩展类库:七牛云存储接口调用
- [3.6]-扩展类库:新型计划任务
- [3.8]-扩展类库:用户、会话和第三方登录集成
- [3.9]-扩展类库:swoole支持下的长链接和异步任务实现
- [3.11]-扩展类库:基于FastRoute的快速路由
- [4.2]-开发实战2:模拟优酷开放平台接口项目开发
- [4.3]-开发实战3:一个简单的小型项目开发(奔跑吧兄弟投票活动)
- [5.1]-架构与思想:PhalApi核心设计和思想解读
- [5.2]-杂谈:扯一些PhalApi的前世和今生
- [5.3]-框架总结:术语表和PHP开发建议
- [5.4]-许可
- [5.5]-联系和加入我们
- [5.6]-更新日记
- [5.8]-致框架贡献者:加入PhalApi开源指南
- [6.1]-基于接口查询语言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi视频教程
- 附录1:接口文档参考模板