我有一個PHP MVC應用程序,我的'M'有一個服務層,映射器層和域層。在哪裏以及如何檢查以確保對象具有所有必需的屬性?在哪裏檢查域對象中的強制屬性?
在我看來,這些責任不屬於映射器或服務層,因此離開域本身。我在我的基礎域類中放了一個方法,checkRequired()
。它根據$_required
屬性數組檢查對象的屬性,如果缺少任何屬性,則會引發錯誤。
當從數據庫中檢索對象時,我一直呼叫checkRequired()
作爲對象構造函數中的最後一個命令。如果對象是一個新的實體(即不從數據庫中檢索),我提供一些默認值(在構造函數中),然後調用checkRequired()
。
雖然這一直行得通,但我現在將一些行爲方法放在我的(有點貧血的)域對象上,並且我遇到了麻煩。例如,用戶可以擁有許多寵物,所以在我的用戶模型中,我使用了addPet()
方法。我知道我需要傳入Pet對象,因爲最好注入依賴關係,因此我的真實方法簽名是User::addPet(ConcretePet)
。
但這就是問題所在!我的寵物不能存在沒有用戶(作爲他們的所有者),所以我不能實例化ConcretePet
!我可以讓用戶在寵物上可選,但這將是一個落後的步驟。我可以將checkRequired()
的內容移到其他地方,但是在哪裏?
解決這種常見問題的典型方法是什麼?
看來,如果一個寵物需要有一個用戶,那麼用戶應該被傳遞到ConcretePet的構造函數 – Orangepill
或者你可以在用戶上創建一個工廠方法來創建一個ConcretePet – Orangepill
我不會回答你的問題(它已經回答了)而是對checkRequired()方法進行評論。這種明確的檢查方法不應該是你的API的一部分,可能隱藏在你的聚合根中。您的構造函數應該足以爲清潔實體實例化(並檢查不變量)提供數據。如果不是,請使用Factory。 – gseric