2012-04-05 50 views
1

我正在加載Zend 1.11並與Doctrine 1.2集成,並且已經閱讀了很多關於使用服務層的內容。服務層:它應該隱藏域模型的API嗎?

就我的理解,服務層位於業務邏輯之上,在控制器和域模型之間添加一個層。

但是,我被困在如何實際實現服務層,主要是因爲我有點不確定應該定義的服務類的類型的API。

首先,給定服務等級,App_Service_Memberships將與App_Model_Group和用戶處理業務實體組作爲App_Model_User

應的服務類的API的通過接受或返回的情況下暴露的類的組合物說域模型?

或者,服務類的API是否應該只接受或返回像整數或數組這樣的本地數據類型來隱藏類的組成?

喜歡說:

class App_Service_Memberships 
{ 

    public function addUserToGroup($user_id, $group_id) 
    { 

     //Create or retrieve domain models here and operate on them; handle persistence. 
     $membership = new App_Model_Membership(); 

     $membership->member->user_id = $user_id; 
     $membership->group->group_id = $group_id; 
     $membership->join_date = date("Y-m-d H:i:s"); 

     $membership->save(); 

     return $membership->toArray(); 
    } 

    public function getMembersOfGroup($group_id) 
    { 
     $groupMembers = array(); 

     //Query objects here with Doctrine or the ORM of choice... 

     foreach($results as $membership){ 
      $groupMembers[] = $membership->member->toArray(); 
     } 

     return $groupMembers; 
    } 
} 

在控制器會在整數只是作爲參數傳遞(數據來自表,或輸出從其他服務類)服務類,完全無視所涉及的領域模型。

,而不是:

class App_Service_Memberships 
{ 
    public function addUserToGroup(App_Model_UserInterface $user, App_Model_Group $group) 
    { 
     //Create or retrieve domain models here and operate on them; handle persistence. 
     $membership = new App_Model_Membership(); 

     $membership->member = $user; 
     $membership->group = $group; 
     $membership->join_date = date("Y-m-d H:i:s"); 

     $membership->save(); 

     return $membership; 
    } 

    public function getMembersOfGroup(App_Model_Group $group) 
    { 
     $groupMembers = array(); 

     //Query memberships here 

     foreach($results as $membership){ 
      $groupMembers[] = $membership->member; 
     } 

     return $groupMembers; 
    } 
} 

在控制器並得到其範圍內處理域模型,並將其傳遞給服務類?

你認爲哪種更好的做法?

回答

1

......服務類的API是否應該通過只接受或返回像整數或數組這樣的本地數據類型來隱藏類的組成?

是的,這是理想的。如果您強制服務的客戶端(在這種情況下爲控制器)通過預先構建的域實體(用戶),則強制客戶端了解很多關於該域的信息。它不應該。

您的服務方法也可以是靜態的(但它們不一定是)。

你不是真的需要App_前綴您的服務類。不知道ZF社區什麼時候開始,但它已經被貨運扼殺,而且確實沒有必要。我通常把服務(和所有應用程序特定的)放在lib之下。更具體地說,我使用src/main/lib,它與src/test/*src/vendor/lib配合得很好。

至於返回值...我通常有服務方法返回某種集合。數組很好;然而,更豐富的收集對象在許多情況下非常有用(但不是強制性的)。有時我只是使用Zend Paginator對象來實現它。它不是可用的最豐富的集合對象,但它可以工作OOTB。

相關問題