W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
先在這里感謝phalapi框架創(chuàng)始人@dogstar,為我們提供了這樣一個(gè)優(yōu)秀的開源框架.
本小節(jié)已經(jīng)步入了進(jìn)階篇,在進(jìn)階篇中會(huì)著重談?wù)撘恍┛蚣苤羞\(yùn)用的一些好的思想并且進(jìn)行解讀,本小節(jié)主要是講解在Phalapi框架中推薦使用的三層結(jié)構(gòu)Api+Domain+Model將從各個(gè)角度和整體角度進(jìn)行講解.
附上:
喵了個(gè)咪的博客:w-blog.cn
官網(wǎng)地址:http://www.phalapi.net/
開源中國Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release
其實(shí)這樣的三層結(jié)構(gòu)和java中的web+service+dao比較像只是說web和api一個(gè)進(jìn)行頁面顯示一個(gè)不進(jìn)行頁面顯示這個(gè)區(qū)別,在著重講一下這三層在Phalapi中分工是怎么樣的,他們分別擔(dān)當(dāng)者什么樣的角色,需要做什么樣的事情.
為什么說Api層像java中的web層呢,因?yàn)樗麄冇幸粋€(gè)共同的特性就是接受請求和返回結(jié)果.只不過java中沒有表現(xiàn)得那么強(qiáng)烈,它會(huì)通過控制器把請求轉(zhuǎn)發(fā)到service層作處理,并將處理結(jié)果在頁面展示,所以Api更像擔(dān)當(dāng)控制器的作用.
Api層中需要做的事情如下:
注冊接口/定義接口和控制請求參數(shù)
這是首先要做的事情,和在web中的url一樣,就是添加需要接受的參數(shù)以及對參數(shù)進(jìn)行驗(yàn)證,如下:
public function getRules(){
return array(
'index' => array( //定義接口名
//添加參數(shù)驗(yàn)證機(jī)制
'username' => array('name' => 'username', 'default' => 'PHPer',),
),
);
}
進(jìn)行業(yè)務(wù)/邏輯的拼接
在這里進(jìn)行業(yè)務(wù)/邏輯拼接,比如說是查詢列表接口需要做兩件事情,第一驗(yàn)證用戶(是否存在或是否有權(quán)限),第二查詢出應(yīng)該返回的列表,應(yīng)該是如下樣式:
//驗(yàn)證用戶
$Domain_Developers = new Domain_Developers();
$Domain_Developers->checkDev($this->dId);
//獲取用戶的APP列表
$Domain_App = new Domain_App();
$Domain_App->getMyAppList($this->dId);
返回結(jié)果
返回結(jié)果就比較簡單了,就是把你經(jīng)過上面拼接處理后獲得的數(shù)據(jù)返回,如下:
return $data;
Domain層主要負(fù)責(zé)的是具體的業(yè)務(wù)實(shí)現(xiàn),如用戶驗(yàn)證,一個(gè)Domain方法就是一個(gè)小的業(yè)務(wù)具體實(shí)現(xiàn)(注意盡量把業(yè)務(wù)劃分得細(xì)一點(diǎn)方便通用)
/**
* 用戶驗(yàn)證
*/
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);
}
}
Model層其實(shí)無需多講,也就是把數(shù)據(jù)庫操作單獨(dú)提煉出來統(tǒng)一處理,如下:
/**
* 驗(yàn)證用戶存不存在
*/
public function checkDevdId($dId){
return $this->getORM()->select('dId')->where('dId', $dId)->fetch();
}
結(jié)構(gòu)清晰,互不干擾
就我個(gè)人感覺來說,在實(shí)際開發(fā)中使用這樣的三層結(jié)構(gòu)帶來的最大的好處在于結(jié)構(gòu)清晰,為什么這么說呢,因?yàn)槊恳粚有枰龅氖虑槎际欠浅*?dú)立的,你永遠(yuǎn)不會(huì)在API層中看到數(shù)據(jù)操作的代碼,所以在排查問題的時(shí)候,如果是數(shù)據(jù)出了問題,肯定不會(huì)去API層里面去找,這樣就非常方便錯(cuò)誤的定位,再者就是代碼可讀性非常高,相對于mvc框架來說這樣的好處是非常明顯的.
高度解耦,靈活高可用
帶來的第二個(gè)很重要的好處就是解耦和高可用,高可用體現(xiàn)在Api可以重復(fù)利用Domain,Domain可以重復(fù)利用Model,這樣可以減少很多不必要的代碼量.如果相互的關(guān)系僅僅只是拼接(除非是結(jié)果會(huì)互相影響)的情況下就實(shí)現(xiàn)了解耦.
分工合作,提高效率
在有這樣的一套規(guī)范之后在分工合用時(shí),對方不需要去看你的代碼具體實(shí)現(xiàn)了什么,只需要看你這個(gè)方法干了什么,直接拿起來用就可以了,當(dāng)然是在業(yè)務(wù)劃分成小塊的情況下,而且可以很明確的劃分出來模塊,當(dāng)你需要用到對方的模塊的時(shí)候只需要讓對方提供即可,這樣可以增加模塊的專注性,從而提高合作開發(fā)的效率.
其實(shí)在剛剛接觸這個(gè)框架的時(shí)候,我也是特別不能理解這樣劃分的作用,在后面的開發(fā)和別人的交流中進(jìn)行了一些嘗試后,發(fā)現(xiàn)這樣用起來確實(shí)有很多的好處,希望今天的教程能讓大家理解這樣的一種規(guī)范可以帶來很多的好處,并且自己去嘗試和使用.
注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!
官網(wǎng)QQ交流群:421032344 歡迎大家的加入!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: