2016-03-02 128 views
3

我與Laravel合作了近兩年,並試圖瞭解使用存儲庫和DDD的所有好處。我仍然在爲如何使用數據和模型的最佳實踐而努力,以獲得更好的代碼可重用性和更好的體系結構。我應該將相關模型保存在存儲庫中嗎?

我看到其他開發人員建議來生成工廠模型,然後使用存儲庫來保存這些車型,如:

public function add(User $user) 
{ 
    return $user->save(); 
} 

,但我應該怎麼辦,萬一我的用戶模型與它相關的模型,像圖像,說明和設置。

我應該爲每個模型創建存儲庫並在控制器中調用add()函數4次,還是應該將保存邏輯放在UserRepository中 - > add()函數傳遞所有模型以及用戶?另外,如何更新功能,該邏輯也可能相當複雜。


更新 - 我需要的是一個實現的實際例子。

+0

你使用雄辯嗎? – Cerad

+0

你確定你想了解DDD嗎?你檢查了*聚合*的概念嗎?倉庫是一種戰術模式,是DDD的一小部分,這不是最重要的。 –

+0

你應該閱讀關於聚合根。看看這個解釋。 http://stackoverflow.com/questions/1958621/whats-an-aggregate-root – rafaels88

回答

1

處理「正確的方式」問題總是很困難。但這是一種方法。

從DDD角度來看,在此特定上下文中,將User對象視爲聚合根實體,將其他對象視爲子值對象。

$description = new UserDescripton('Some description'); 
$image1 = new UserImage('head_shot','headshot.jpg'); 
$image2 = new UserImage('full_body','fullbody.jpg'); 

$user = new User('The Name',$description,[$image1,$image2]); 

$userRepository->persist($user); 

首先要注意的事情是,你如果真想嘗試和應用一些概念DDD那麼它想在域模型方面,而無需擔心如何保持他們是非常重要的。如果你發現你基本上是用一堆getter和setter編寫一個CRUD應用程序,並且幾乎沒有業務邏輯,那麼幾乎忘記了它。你最終會做的就是增加複雜性而沒有太多價值。

堅持行是用戶將被存儲的地方。你當然不想編寫一堆代碼來存儲和更新孩子。同樣,爲價值對象創建存儲庫通常會浪費精力。如果你要走這條路線,那麼你確實需要某種能夠理解單個對象及其關係的數據庫層。關鍵是關鍵。

我假設你正在使用Laravel的Eloquent活動記錄持久層。我並不熟悉它知道如何輕鬆地持久化和更新聚合根。

我所展示的代碼實際上更多地基於Doctrine 2對象關係映射器,並且非常適用於開箱即用。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/很容易將它與Laravel集成。

但即使是第二條主要是CRUD導向。在不同的域上下文中,用戶對象將被區別對待。它可能開始涉及到基本上針對不同的上下文具有不同的用戶實現。所以確保領域層的收益是值得的。

+0

謝謝你的回答。這可能不是我正在尋找的確切答案,但它給了我一個想法,我應該思考和尋求什麼。我還發現了一些關於如何使用Account和Entries的好文章,這是一個很好的例子。一直想了解這個領域。雄辯的方式也有一些方法來保存相關模型,雖然它不夠高雅。它看起來像$ user-> save()和$ user-> images() - > save($ image),$ user-> description() - > save($ description)之後。而且這些方法只有在模型是新的或已更新時纔會保存。 – naneri

+0

我也可以問一個問題。我應該在哪裏應用不同的統計方法,如計算用戶數量或用戶配置文件視圖總數。我明白,它應該是在用戶域的類 - 但該類應該是UserRepository或另一個像UserStatistics類? – naneri

+0

這兩個統計數據本質上都是數據庫查詢。我會把他們放入回購。如果回購開始變得難以管理,那麼我會分解它。 – Cerad

1

我不是一個PHP傢伙,但從我所能找到的,Laravel是一個MVC框架,與DDD無關。

檢查this presentation,它不會進入領域建模,更專注於戰術,但至少它具有諸如命令處理和域事件之類的優點,簡要解釋具有活動記錄的存儲庫。

它也提到了最後一張幻燈片中的兩本標誌性DDD書,我建議你也看看這些書。

+0

男人,我已經提高了你的答案,因爲它讓我對一些我感興趣的DDD概念有了一些瞭解,但不幸的是,他們沒有回答這個問題 - 在存儲庫中保存和更新相關模型的正確方法是什麼。 – naneri

相關問題