我對DDD(域驅動設計)在過去幾天感興趣,但我無法弄清誰創建和驗證實體的責任。我會打破這個問題以涵蓋不同的場景。DDD - 實體創建和驗證責任
正則實體(可能帶有值對象)。舉一個例子,讓我們接受一個由電子郵件標識的用戶。我有一個UserFactory接收一組數據(可能來自POST表單),並返回一個新的UserEntity。工廠是否應該驗證數據的完整性(例如:Email給的字符串是真實的電子郵件,密碼字段1和字段2的密碼等)?工廠應該驗證沒有這樣的用戶存在(我們不想使用同一封電子郵件註冊兩個用戶)?如果是的話,它應該做我自己還是使用UserRepository?
集合實體。讓我們假設我們有一個Post實體和評論實體。我想獲得所有評論12後,所以我做類似
$ post = $ postRepository-> getById(12);
getById應該如何實現?像這樣:
public function getById($id) {
$postData = $this->magicFetchFromDB($id);
$comments = (new CommentRepository())->getForPost(12);
return new PostEntity($postData, $comments);
}
或者這個職位負責懶人創造的意見,是這樣的:
class PostEntity {
public function getComments() {
if(is_null($this->_comments)) $this->_comments = (new CommentRepository())->getForPost($this->_id);
return $this->_comments;
}
}
? 我在這裏很迷茫,沒有足夠的信息與PHP中的DDD的例子,所以任何幫助將不勝感激!
非常感謝, skwee。
感謝您的評論! A)我不確定是否要在實體中進行驗證。你會考慮驗證captcha是否是業務邏輯的一部分?如果我有管理面板手動添加用戶而不需要驗證碼? B)是的我可以,但問題是這是誰的責任?驗證圖層?廠?庫? C)好吧,但是如果我的用戶有帖子發表評論,如果加載所有這些數據以顯示用戶個人資料頁面,這會很聰明嗎? – 2012-02-08 21:35:32
a)它確實取決於您的需求,我發現使用助手類在實體本身進行驗證「更容易」。但增加一層額外的驗證非常好。 b)我會說這是驗證層的責任。如果兩個賬戶不能有相同的號碼,並且您嘗試添加一個已經存在的號碼,這意味着該實體** ** **,或者至少這就是我的想法。 – jere 2012-02-09 18:02:13
c)這也取決於你想要什麼。如果您要在個人資料頁面上一次顯示所有信息,那麼請在一次調用中加載所有信息。但是如果你展示的是,只能發佈帖子,並且當你點擊一個顯示評論的時候,最好在那一刻加載評論,或許使用ajax – jere 2012-02-09 18:03:14