處理「正確的方式」問題總是很困難。但這是一種方法。
從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導向。在不同的域上下文中,用戶對象將被區別對待。它可能開始涉及到基本上針對不同的上下文具有不同的用戶實現。所以確保領域層的收益是值得的。
你使用雄辯嗎? – Cerad
你確定你想了解DDD嗎?你檢查了*聚合*的概念嗎?倉庫是一種戰術模式,是DDD的一小部分,這不是最重要的。 –
你應該閱讀關於聚合根。看看這個解釋。 http://stackoverflow.com/questions/1958621/whats-an-aggregate-root – rafaels88