#[PhalApi(π框架) - PHP輕量級開源接口框架 - V1.3.3](http://www.phalapi.net)
PhalApi,簡稱π框架,專注于接口開發,致力讓接口開發更簡單。支持HTTP、SOAP和RPC協議,可用于快速搭建微服務、RESTful接口或web services,關注于測試驅動開發、領域驅動設計、極限編程、敏捷開發以及如何快速、穩定、持續交付有價值的接口服務。
在此借一行文字的空間,感謝 **開源中國** 這么好的分享平臺,同時也感謝您花費寶貴的時間來閱讀此文檔,在開源的路上,您每一次真心的關注和肯定都是我們前進的最大動力!謝謝!
此框架代碼開源、產品開源、思想開源,可用于個人、商業用途等,請放心使用。更多內容,請訪問官網:

#背景
過去十年,是互聯網時代;如今的十年,是移動時代。
在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://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 ,訪問效果如下:

因此,接口所需要的參數,對于接口開發人員,也只是簡單配置一下參數規則,便可以輕松獲取。
#[贊!]接口單元測試
不能被測試的代碼,不是好代碼。
在使用此框架進行接口開發時,我們強烈建議使用測試驅動開發,以便于不斷積累形成接口測試體系,保證接口向前向后兼容。
例如對接口 **/?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']);
}
```
運行效果:

對于框架的核心代碼,我們也一直堅持著單元測試,其核心框架代碼的單元測試覆蓋率可高達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 //接口單元測試
```
以下為一示例目錄結構圖解

#加入我們
顯然,這只是一個開始,我們要走的路還很長。這些也不是一個人可以完成的。即使可以,也需要很長一段時間。
在一個人還年輕的時候,我覺得,就應該著手致力做一些對社會有意義的事情,因此我選擇了開源。
如果能夠有機會和你一起為之努力,將會是我的榮幸,也是一段令值得興奮激動的。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:接口文檔參考模板