鍍金池/ 問(wèn)答/PHP/ 關(guān)于PHP實(shí)戰(zhàn)中,項(xiàng)目架構(gòu),我想請(qǐng)教一下各位!

關(guān)于PHP實(shí)戰(zhàn)中,項(xiàng)目架構(gòu),我想請(qǐng)教一下各位!

1,簡(jiǎn)單介紹一下,我現(xiàn)在理解的。我們現(xiàn)在做項(xiàng)目,比如商場(chǎng)。我們雖然是采用的MVC模式進(jìn)行開(kāi)發(fā),但感覺(jué)其中讓我有些迷茫的是,感覺(jué)像不是MVC。而且,我們公司的同事,都是這樣開(kāi)發(fā)的,讓我覺(jué)得,我們好閉關(guān)鎖國(guó)。所以想請(qǐng)教一下,各位PHP們的看法。

:接下來(lái),我就用代碼來(lái)描述一下。

//user.php[controller] -- 用戶控制器

class user {

    //獲取用戶信息[接口,或者是控制器入口]
    public function getUserInfo(){
        $mUser = new UserModel();
        $tUser = $mUser->getInfo($this-userId);
        
        echo json_encode($tUser);//輸出信息
    }
    
    
    
    //復(fù)雜一點(diǎn)的控制器 舉例用下單。
    public function order(){
        $product = I('product_id');//產(chǎn)品id
        $address = I('address_id');//收獲地址id
        $coupon = I('cuopon');//紅包id
        $bouns = I('bouns');//代金卷id
    
        
        #檢查produt是否存在
        //code .....
        
        #檢查紅包是否合理
         //code .....
         
        #檢查代金卷是否合理
         //code .....
         
        #檢查地址是否合理
         //code .....
         
        #獲取運(yùn)費(fèi)
         //code .....
         
        #操作訂單數(shù)據(jù)
         //code .....
         
        #保存訂單到數(shù)據(jù)庫(kù)
         //code .....
         
        
        echo '成功';
        
        //最后,我想表達(dá)的是,如果業(yè)務(wù)邏輯較多,我們的操作是,
        //會(huì)把這一系列的業(yè)務(wù)邏輯都放在控制器里面。這種有問(wèn)題沒(méi)???,我總覺(jué)得,這樣做很復(fù)雜。
    }

}

模型:

//user 模型 [tp為例]
class UserModel{

    public function getInfo($userId){
    
        //我們的理解是,將與數(shù)據(jù)庫(kù)模型操作的,封裝起來(lái)。
        $tA = M('user')->where(array('user_id'=>$userId))->find();
        
        //下面,還可以進(jìn)行一些數(shù)據(jù)的操作
        
        return $tA;
    }
    
    //復(fù)雜一點(diǎn)的模型
    public function getOrderInfo($id = '', $code = '',$userId = ''){
    
        //這方法的總點(diǎn)是,我們?cè)匍_(kāi)發(fā)中,總是會(huì)先像第一個(gè)方法一樣,
        //寫(xiě)的時(shí)候很簡(jiǎn)潔,看起來(lái)就是單一職責(zé),
        //寫(xiě)到后面,你發(fā)現(xiàn)那個(gè)方法,其實(shí)可以加個(gè)參數(shù),就可以重用了。
        //然后到最后,你就暈了。這個(gè)方法,到底用來(lái)干嘛的,
        //問(wèn):這種一個(gè)方法的設(shè)計(jì)原則,應(yīng)該是單一職責(zé)吧,如果需要重用這種方式是否合理,
        //應(yīng)該怎么來(lái)設(shè)計(jì)比較好?
        
        
        
    }
}
//最后用一些方式來(lái)標(biāo)識(shí)設(shè)計(jì)的架構(gòu)

C - controller
M - model


例如一個(gè)操作
請(qǐng)求接口 ->  C   -> 調(diào)用M的方法1
                -> 調(diào)用M的方法2
                -> 調(diào)用M的方法3
                -> 調(diào)用M的方法4
                -> 調(diào)用M的方法5
                -> 調(diào)用M的方法6
                ->輸出結(jié)果
//這是公司同事的架構(gòu),他們總覺(jué)得,我的模型,只要封裝好方法就行了。然后控制器,可以一直這樣處理業(yè)務(wù)邏輯

//我的問(wèn)題是,這種看起來(lái)是沒(méi)有錯(cuò),但閱讀起來(lái),難度相當(dāng)大,因?yàn)槊總€(gè)方法之間,依賴有點(diǎn)多(指M的方法1...6)
//如果你增加,或者減少一個(gè)M方法,那你就要閱讀整個(gè)業(yè)務(wù)邏輯代碼,好復(fù)雜。
//最后,
//我的理想業(yè)務(wù)邏輯是

C ->  M方法1 -> M1方法1->M2方法1
  ->  M2方法1 ->M1方法1->M2方法3


//我想的是,能不能做到,一個(gè)業(yè)務(wù)邏輯,看起來(lái)每一塊都是單一職責(zé),都有一個(gè)入口,和一個(gè)出口,

不知道我表達(dá)清楚沒(méi),哈哈哈。
總結(jié)一些吧。我想學(xué)習(xí)一下大家開(kāi)發(fā)項(xiàng)目的架構(gòu)設(shè)計(jì),關(guān)于MVC模式的架構(gòu)。請(qǐng)大家和我一起分享一下。好嗎?

回答
編輯回答
安淺陌

json 響應(yīng)可以封裝成一個(gè)基類,然后控制器繼承,返回時(shí)統(tǒng)一調(diào)用基類的方法。
clipboard.png
把控制器中可以分離的都解耦到Service層,然后注入到控制器中,你這個(gè)應(yīng)該是 TP, TP5 應(yīng)該有依賴注入了。
表單驗(yàn)證可以考慮使用更面向?qū)ο蟮姆椒ǎ热邕@樣的:

clipboard.png

最后那兩個(gè)畫(huà)的沒(méi)看得清楚。
我通常是這樣寫(xiě)的

clipboard.png

clipboard.png

clipboard.png

2017年9月23日 23:56
編輯回答
久不遇

沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)吧,我可以分享一下我們的做法,我們不是mvc。

app |
    |- Comps |
             |--- Article |
                          |--- ArticleTransformer.php
                          |--- ArticleModule.php
                          |--- ArticleRepository.php
                          |--- ArticleService.php
                          |--- ArticleTrait.php
    |- doc |
           |--- sql |
                    |--- sql
    |- Config |
              |--- database.php
    |- Helpers |
               |--- Support.php
    |- Models |
              |--- Article.php
https |
      |- Controllers |
                     |--- Article |
                                  |--- ArticleController.php
                     |--- register.php
                     |--- routes.php
vendor |...

比如這個(gè)
app為項(xiàng)目目錄:

  • Comps為模塊目錄,將項(xiàng)目分成相應(yīng)的模塊;
  • Transformer方法來(lái)格式化輸出數(shù)據(jù)(對(duì)外);
  • Module文件為模塊入口(對(duì)外);
  • Repository為數(shù)據(jù)庫(kù)操作Model的倉(cāng)庫(kù)(對(duì)內(nèi));
  • Service為處理復(fù)雜邏輯(對(duì)內(nèi));
  • Trait為對(duì)外暴露Module和Transformer文件出口;
  • Config為配置目錄
  • Helpers為支持文件目錄
  • Models為數(shù)據(jù)庫(kù)Model目錄
  • doc為文檔目錄
  • Controllers為路由目錄;

controllers只能通過(guò)trait來(lái)調(diào)用module目錄里面的Module和Transformer文件,模塊之間的調(diào)用可以直接調(diào)用對(duì)方的module,但是!Server和Repository不能跨模塊調(diào)用

2017年8月1日 00:41