#phalapi-進階篇1(Api,Domain,和Model)#

##前言##
***先在這里感謝phalapi框架創始人@dogstar,為我們提供了這樣一個優秀的開源框架.***
本小節已經步入了進階篇,在進階篇中會著重談論一些框架中運用的一些好的思想并且進行解讀,本小節主要是講解在Phalapi框架中推薦使用的三層結構Api+Domain+Model將從各個角度和整體角度進行講解.
附上:
喵了個咪的博客:[w-blog.cn](w-blog.cn)
官網地址:[http://www.phalapi.net/](http://www.phalapi.net/ "PhalApi官網")
開源中國Git地址:[http://git.oschina.net/dogstar/PhalApi/tree/release](http://git.oschina.net/dogstar/PhalApi/tree/release "開源中國Git地址")
##1. Api+Domain+Model##
其實這樣的三層結構和java中的web+service+dao比較像只是說web和api一個進行頁面顯示一個不進行頁面顯示這個區別,在著重講一下這三層在Phalapi中分工是怎么樣的,他們分別擔當者什么樣的角色,需要做什么樣的事情.
###1.1 Api層###
為什么說Api層像java中的web層呢,因為他們有一個共同的特性就是接受請求和返回結果.只不過java中沒有表現得那么強烈,它會通過控制器把請求轉發到service層作處理,并將處理結果在頁面展示,所以Api更像擔當控制器的作用.
Api層中需要做的事情如下:
1. 注冊接口/定義接口和控制請求參數
這是首先要做的事情,和在web中的url一樣,就是添加需要接受的參數以及對參數進行驗證,如下:
public function getRules(){
return array(
'index' => array( //定義接口名
//添加參數驗證機制
'username' => array('name' => 'username', 'default' => 'PHPer',),
),
);
}
2. 進行業務/邏輯的拼接
在這里進行業務/邏輯拼接,比如說是查詢列表接口需要做兩件事情,第一驗證用戶(是否存在或是否有權限),第二查詢出應該返回的列表,應該是如下樣式:
//驗證用戶
$Domain_Developers = new Domain_Developers();
$Domain_Developers->checkDev($this->dId);
//獲取用戶的APP列表
$Domain_App = new Domain_App();
$Domain_App->getMyAppList($this->dId);
3. 返回結果
返回結果就比較簡單了,就是把你經過上面拼接處理后獲得的數據返回,如下:
return $data;
###1.2 Domain層###
Domain層主要負責的是具體的業務實現,如用戶驗證,一個Domain方法就是一個小的業務具體實現(注意盡量把業務劃分得細一點方便通用)
/**
* 用戶驗證
*/
public function checkDev($dId){
//通過ID 獲取用戶
$Model_Developers = new Model_Developers();
$dev = $Model_Developers->checkDevdId($dId);
//用戶不存在處理
if(!$dev){
throw new PhalApi_Exception_BadRequest(T('No Dev'), -1);
}
}
###1.3 Model層###
Model層其實無需多講,也就是把數據庫操作單獨提煉出來統一處理,如下:
/**
* 驗證用戶存不存在
*/
public function checkDevdId($dId){
return $this->getORM()->select('dId')->where('dId', $dId)->fetch();
}
##2. 三層結合使用的好處##
1. 結構清晰,互不干擾
就我個人感覺來說,在實際開發中使用這樣的三層結構帶來的最大的好處在于結構清晰,為什么這么說呢,因為每一層需要做的事情都是非常獨立的,你永遠不會在API層中看到數據操作的代碼,所以在排查問題的時候,如果是數據出了問題,肯定不會去API層里面去找,這樣就非常方便錯誤的定位,再者就是代碼可讀性非常高,相對于mvc框架來說這樣的好處是非常明顯的.
2. 高度解耦,靈活高可用
帶來的第二個很重要的好處就是解耦和高可用,高可用體現在Api可以重復利用Domain,Domain可以重復利用Model,這樣可以減少很多不必要的代碼量.如果相互的關系僅僅只是拼接(除非是結果會互相影響)的情況下就實現了解耦.
3. 分工合作,提高效率
在有這樣的一套規范之后在分工合用時,對方不需要去看你的代碼具體實現了什么,只需要看你這個方法干了什么,直接拿起來用就可以了,當然是在業務劃分成小塊的情況下,而且可以很明確的劃分出來模塊,當你需要用到對方的模塊的時候只需要讓對方提供即可,這樣可以增加模塊的專注性,從而提高合作開發的效率.
##3. 總結##
其實在剛剛接觸這個框架的時候,我也是特別不能理解這樣劃分的作用,在后面的開發和別人的交流中進行了一些嘗試后,發現這樣用起來確實有很多的好處,希望今天的教程能讓大家理解這樣的一種規范可以帶來很多的好處,并且自己去嘗試和使用.
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
**官網QQ交流群:421032344 歡迎大家的加入!**
####[上一章](/wikis/%5b7.6%5d-phalapi-%e5%85%a5%e9%97%a8%e7%af%876(%e5%b0%8f%e6%8a%80%e5%b7%a7%e5%92%8c%e6%b5%85%e8%b0%88API%e9%80%82%e7%94%a8%e8%8c%83%e5%9b%b4%e4%bb%a5%e5%8f%8a%e5%85%a5%e9%97%a8%e7%af%87%e6%80%bb%e7%bb%93).html) [文檔首頁](/wikis/) [下一章](/wikis/%5b7.8%5d-phalapi-%e8%bf%9b%e9%98%b6%e7%af%872(DI%e4%be%9d%e8%b5%96%e6%b3%a8%e5%85%a5%e5%92%8c%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f).html)
- 空白目錄
- [7.1]-phalapi-入門篇1(簡單介紹以及環境搭建)
- [7.2]-phalapi-入門篇2(把它玩起來)
- [7.3]-phalapi-入門篇3(請求和返回)
- [7.4]-phalapi-入門篇4(國際化高可用和自動生成文檔)
- [7.5]-phalapi-入門篇5(數據庫操作和Model層)
- [7.6]-phalapi-入門篇6(小技巧和淺談API適用范圍以及入門篇總結)
- [7.7]-phalapi-進階篇1(三層結構Api,Domain,和Model)
- [7.8]-phalapi-進階篇2(DI依賴注入和單例模式)
- [7.9]-phalapi-進階篇3(自動加載和攔截器)
- [7.10]-phalapi-進階篇4(notorm進階以及事務操作)
- [7.11]-phalapi-進階篇5(數據庫讀寫分離)
- [7.12]-phalapi-進階篇6(解決大量數據存儲數據庫分表分庫拓展)
- [7.13]-phalapi-進階篇7(使用緩存以及用redis拓展解決實際問題)
- [7.14]-phalapi-進階篇8(PhalApi能帶來什么和進階篇總結)