2016-01-05 74 views
0

根據這篇文章here我正確使用域對象嗎?

你可以把它們[服務]作爲「更高級別的域對象」,但不是商業邏輯,服務負責域對象和映射器之間的互動。這些結構最終創建了一個用於與域業務邏輯進行交互的「公共」接口。您可以避免它們,但是會將一些域邏輯泄漏到控制器中。

我一直在閱讀MVC,並將其分解爲服務,域對象和數據映射器。服務和數據映射器很容易弄清楚,但我不明白域對象的原因,請給我一些例子嗎?這裏是我的代碼:

MemberService

class MemberService extends Service 
{ 
    public function authenticate() 
    { 
     $domainObject = $this->domainObjectFactory->getDomainObject('Member'); 
     $dataMapper = $this->databaseFactory->getMapper('Member'); 

     $_temp_sess_id = 0; 
     $_temp_sess_password = ""; 

     $member = $dataMapper->fetch($_temp_sess_id); 
     $authenticationResult = $domainObject->checkPassword($member['password'], $_temp_sess_password); 

     if (!$authenticationResult) 
     { 
      $member = ['user_id' => 0]; 
     } 

     return $member; 
    } 
} 

MemberDomainObject

class MemberDomainObject extends DomainObject 
{ 
    public function checkPassword($dataMapperPassword, $locallyStoredPassword) 
    { 
     if ($dataMapperPassword !== $locallyStoredPassword) 
      return false; 
     return true; 
    } 
}  

UPDATE:

這個問題是關於方法checkPassword和爲什麼它要創建一個單獨的對象只是使用一個可以在服務內部使用的IF語句,從而使RAM不再使用額外的資源來創建一個新的對象。

+0

的可能的複製指定返回類型[瞭解域對象/服務(HTTP:/ /stackoverflow.com/questions/5589141/understanding-domain-objects-services) – Reloecc

+0

好吧,它說:「域對象是數據,域服務是數據部分。」所以我必須在服務部分完成所有的if,而將$ member存儲在DO中? –

+0

也根據這個答案在這裏:http://stackoverflow.com/questions/5863870/how-should-a-model-be-structured-in-mvc?lq=1,「你可以想到他們[服務]作爲「更高級別的域對象」,而不是業務邏輯,服務負責域對象和映射器之間的交互。「 –

回答

0

在示例中,您剛創建了一個MemberDomainObject槽。你顯示的代碼沒有爲零的信息價值爲此目的。

你需要製作一個真正的應用程序,至少有幾個對象,服務和兩個域,所以任何人都可以說「你正在使用域對象」。

你不是隻對「模型對象」感興趣嗎?如果您需要確定使用正確的「服務>工廠>模型對象>映射器」關係,則無需談論域對象。


通過工廠創建對象是一種很好的做法,因爲您可以在重構期間在一個地方更改或添加構造器調用。

一個建議是:在你的工廠命名空間(FQN)使用類名稱,它可以幫助你導航槽代碼,並與重構以及

$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::class); //in php5.5+ 

你可以用

class DomainObject 
{ 

    static function className(){ 
     return get_called_class(); 
    } 
} 

$member = $this->domainObjectFactory->getDomainObject(MemberDomainObject::className()); 

替代在php < = 5.4並在升級時替換它。

爲相同

$member = $this->domainObjectFactory->getMember(); 

是不是一個問題,因爲你可以在:: getMember()

+0

我不能把名字空間畫出來。另外,你寫的是對的,但它不回答我的問題。我的問題是 - 爲什麼我需要域對象?如果你看這條線:$ authenticationResult = $ domainObject-> checkPassword($ member ['password'],$ _temp_sess_password);這可以用一個簡單的IF語句來代替,這將消除使用RAM資源創建新對象的需要。 –

+0

然後改變你的問題,如「爲什麼保持在模型中的模型邏輯,而不是在控制器」如果你有興趣.. – Reloecc

+0

我問的方式是完全有效的隊友。 –