2016-12-01 79 views
0

我使用Slim3和PHP開始了一個使用有限的應用程序體系結構知識的項目。該計劃是爲了創建項目和單獨的應用程序問題。這一切進展順利,但隨着應用程序的增長,事情變得非常混亂。什麼是存儲庫,服務和操作/控制器?

這樣做的整個想法是爲了使開發更容易。它在某種程度上可以做到,但我發現有時候需要密切關注數據流。

我需要一些關於倉庫,服務和控制器/操作的建議。以及他們應該如何在系統中工作。我目前的瞭解它們是下面:

庫是服務層和模型層之間使用。例如,在UserRepository中,您將創建包含從數據庫讀取/寫入的代碼的方法。在PHP中,在repo方法中將使用PDO或ORM。例如:

class UserRepository 
{ 
    public function findByID($id) { ... } 
    public function findByEmail($email) { ... } 
    public function findByMobile($mobile) { ... } 
    public function createEmail($email, $firstname, $lastname, $password) { ... } 
    public function createMobile($mobile, $firstname, $lastname, $password) { ... } 
} 

我已經提出了一些示例方法。但可能會有更多。

服務

服務層封裝應用程序邏輯。例如,UserService將負責創建帳戶,並執行所需的邏輯以註冊用戶。服務也可以是第三方,例如爲Facebook的SDK或ORM創建服務。

一個例子服務:

class UserService 
{ 
    public function createMobile($mobile, $firstname, $lastname, $password)  { 
    /* 
    * Call a validation service to validate input 
    */ 
    ... 

    /* 
    * Use UserRepository's findByMobile() to check if account exists 
    */ 
    ... 

    /* 
    * Use UserRepository's createMobile() to create account 
    */ 
    ... 

    /* 
    * Call SMS service to send verification code 
    */ 
    ... 
    } 

    public function createEmail(...) { ... } 
    public function getFollowers (...) { ... } 
} 

操作

我不知道這是否是一個真正的術語。它在Slim Framework文檔中使用,似乎代表了一個瘦控制器。

一個Action包含非常少的邏輯,用於調用服務。除非有正當的理由,否則Action很少會直接調用存儲庫。 Action將對從服務返回的數據執行基本檢查,以便將響應發送回客戶端。

他們綁定到個人路線。我正在使用它們:

class ActivateEmailAction extends Action { 

    public function __invoke(Request $request, Response $response, $args = []) 
    { 
     if(!$this->ci->ActivationService->activateEmail($args['token'])){ 
      return $response->withJson([ 
       'status' => 'error', 
       'data' => null, 
       'message' => 'Invalid verification token' 
      ]); 
     }; 

     return $response->withJson([ 
      'status' => 'success', 
      'data' => null, 
      'message' => null 
     ]); 
    } 
} 

我是否正確使用這些模式?我似乎採取的流程是這樣的:

  1. 一切都從路線開始。例如,請求/create。路由被註冊到一個Action。
  2. 行動決定調用何種服務
  3. 服務執行邏輯,使其他服務和存儲庫調用如果需要
  4. 服務手回數據
  5. 行動返回響應行動

任何建議將不勝感激。

+0

我看到關閉已被選爲過於寬泛。我不同意。使用這種設計模式設計應用程序通常只有一個正確答案。例如,你不會使用存儲庫中的服務,這是不好的做法。由於知識的潛在差距,我很可能會做一些被認爲是不好的做法,這就是我問過的原因。 – BugHunterUK

+0

你所做的一切都很好 - 是你尋找的答案嗎? ) –

+0

@GeorgyIvanov我的知識受到限制,其中很大一部分是基於猜測或常識,我認爲在某些地方我做得不正確,因爲我在管理項目時仍然面臨一些複雜性。 – BugHunterUK

回答

2

我是否正確使用這些模式?

是的,你是。我所給出的一般建議是不要給你的班級和服務特別是太多的責任:遵循單一責任原則,基本上規定「我的班級應該只有一個改變的理由」(即M.Fowler的)據我記得實際上是R. Martin,這要感謝Gordon在評論中的更正)。

您的UserService似乎正在處理太多不同的任務:它處理註冊並抓住追隨者。並可能發送短信。將註冊相關邏輯提取到UserRegistrationService類中。

+0

啊,非常好的SRP建議。在決定「去哪裏最好的地方」時,我常常陷入困境。因此,我得到的課程太多了。一般來說,當你遵循SRP時,會大大增加應用程序中的類數量? – BugHunterUK

+0

@BugHunterUK,是的,但是這不正是你要做的嗎?打破「大神」類到「較小焦點」類。 )至於「太多類」 - 只要你的代碼是按邏輯組織的,你不可能遇到這樣的問題。 –

-3

如果你的應用程序架構的知識有限,我建議你閱讀這本書的設計模式第一:http://amzn.eu/aNVH8Ii

第二點是不使用苗條的框架。對於那些已經知道他們想要構建什麼以及如何去做的人來說,這是一個小框架。絕對不是學習任何模式或應用程序體系結構的框架。

我建議看看的Yii 2:http://www.yiiframework.com/doc-2.0/guide-index.html

Yii中使用了大部分的設計模式和架構解決方案,它們通常在大型應用的今天,並且易於學習和理解。

+1

Slim是學習模式的極好框架,因爲它迫使您真正創建應用程序的體系結構。 Yii是一個不可或缺的最佳實踐。 –

+0

爲什麼不呢?正如我所說,這些建議。對我來說,通過在一個大框架內查看,可以更容易地理解模式,因爲您可以看到它們在生產中的使用方式,而不是在紙上。沒有實踐的理論不是很有幫助。 –

相關問題