三層結(jié)構(gòu)Api,Domain,和Model

2018-11-21 21:29 更新

PHALAPI-進(jìn)階篇1(API,DOMAIN,和MODEL)

前言

先在這里感謝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

1. Api+Domain+Model

其實(shí)這樣的三層結(jié)構(gòu)和java中的web+service+dao比較像只是說web和api一個(gè)進(jìn)行頁面顯示一個(gè)不進(jìn)行頁面顯示這個(gè)區(qū)別,在著重講一下這三層在Phalapi中分工是怎么樣的,他們分別擔(dān)當(dāng)者什么樣的角色,需要做什么樣的事情.

1.1 Api層

為什么說Api層像java中的web層呢,因?yàn)樗麄冇幸粋€(gè)共同的特性就是接受請求和返回結(jié)果.只不過java中沒有表現(xiàn)得那么強(qiáng)烈,它會(huì)通過控制器把請求轉(zhuǎn)發(fā)到service層作處理,并將處理結(jié)果在頁面展示,所以Api更像擔(dān)當(dāng)控制器的作用.

Api層中需要做的事情如下:

  1. 注冊接口/定義接口和控制請求參數(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',),
            ),
    );

    }

  2. 進(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);
  3. 返回結(jié)果

    返回結(jié)果就比較簡單了,就是把你經(jīng)過上面拼接處理后獲得的數(shù)據(jù)返回,如下:

     return $data;

1.2 Domain層

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);
    }
}

1.3 Model層

Model層其實(shí)無需多講,也就是把數(shù)據(jù)庫操作單獨(dú)提煉出來統(tǒng)一處理,如下:

/**
 * 驗(yàn)證用戶存不存在
 */
public function checkDevdId($dId){
    return $this->getORM()->select('dId')->where('dId', $dId)->fetch();
}

2. 三層結(jié)合使用的好處

  1. 結(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框架來說這樣的好處是非常明顯的.

  2. 高度解耦,靈活高可用

    帶來的第二個(gè)很重要的好處就是解耦和高可用,高可用體現(xiàn)在Api可以重復(fù)利用Domain,Domain可以重復(fù)利用Model,這樣可以減少很多不必要的代碼量.如果相互的關(guān)系僅僅只是拼接(除非是結(jié)果會(huì)互相影響)的情況下就實(shí)現(xiàn)了解耦.

  3. 分工合作,提高效率

    在有這樣的一套規(guī)范之后在分工合用時(shí),對方不需要去看你的代碼具體實(shí)現(xiàn)了什么,只需要看你這個(gè)方法干了什么,直接拿起來用就可以了,當(dāng)然是在業(yè)務(wù)劃分成小塊的情況下,而且可以很明確的劃分出來模塊,當(dāng)你需要用到對方的模塊的時(shí)候只需要讓對方提供即可,這樣可以增加模塊的專注性,從而提高合作開發(fā)的效率.

3. 總結(jié)

其實(shí)在剛剛接觸這個(gè)框架的時(shí)候,我也是特別不能理解這樣劃分的作用,在后面的開發(fā)和別人的交流中進(jìn)行了一些嘗試后,發(fā)現(xiàn)這樣用起來確實(shí)有很多的好處,希望今天的教程能讓大家理解這樣的一種規(guī)范可以帶來很多的好處,并且自己去嘗試和使用.

注:筆者能力有限有說的不對的地方希望大家能夠指出,也希望多多交流!

官網(wǎng)QQ交流群:421032344 歡迎大家的加入!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號