2012-09-30 133 views
-1

我希望我遵循程序的權利,這個問題就足夠了。我試圖尋找無濟於事,所以我希望我能在這裏得到答案。實施DDD封裝

我剛開始進入Laravel。我注意到了一種名爲DDD的新設計方法,我想嘗試盡我所能實現它。

假設我有一個位於模型文件夾中的用戶包。使用主類來訪問諸如驗證用戶之類的功能會不會是一種很好的做法?這個類將放在包的主目錄下,並且將被稱爲User。本質上這將封裝存儲庫,實體和服務。這樣,需要這些數據的控制器就不會受到一堆呼叫的污染。

例如:爲了驗證用戶登錄,我們稱之爲:

User->validateUserLogin($username, $password); 

內。然後User->validateUserLogin:

public function validateUserLogin($username, $password) 
{ 
    $user_login = new User_Login_Entity($username, $password); 
    // Assume the validation returns a valid User object on successful validation 
    $User = User_Validation_Service->ValidateUserCredentials($user_login) 
} 

我要對這個錯誤?我知道SRP是這方面的關鍵,我不確定我是否足夠好/完全遵循。基本上我的想法是:從控制器到模型工作的一個入口點。這與控制器調用存儲庫,服務和實體相反。

回答

3

你幾乎沒有。您應該提供從控制器POV訪問使用「模型」的「使用案例」。這樣做的代碼通常被稱爲應用程序服務。他們坐在你的模型和控制器之間。現在,請注意,當我說「用例」時,我的意思是改變應用程序/系統/服務/構建狀態的操作。這不包括間接的查詢或其他問題。這些最好用數據存儲上非常薄的一層來建模。但是......應用程序服務可以執行查詢以完成,沒有任何問題。它不是黑色和白色,只是不同的灰色陰影。從控制器的角度來看,它使得操作和查詢之間有了非常明確的區別,讓它依賴於精簡查詢層和應用程序服務。

+0

嗨,謝謝你的回答!這肯定有助於我應該如何分層。我還有另一個問題:我基本上是爲每個國家創建一個新的實體。 例如:來賓到我的系統將得到一個Guest_Entity,用於存儲瀏覽器數據,IP等。當他們嘗試登錄時,會給他們一個名爲User_Login_Entity的新實體,它將存儲他們的用戶名,密碼。如果他們有效,他們會得到一個完整的用戶實體。這是最好的方法嗎?或者我應該使用一個海量實體進行部分分配? – thatonefreeman

+0

當談到PHP時,我完全不識字,所以不要指望我給你提供建議。你說的是,你想跟蹤你的網站的「客人」或「(匿名)訪問者」,以及他們何時/如果他們登錄,你想要將他們的匿名行爲與他們登錄的行爲聯繫起來。根據我的瞭解,這隻需要一個「相關ID」。爲什麼不將這個「瀏覽會話」標識符傳遞給匿名跟蹤和登錄跟蹤?然後,這就是你的網絡服務器的日誌,不是嗎? –

+0

對不起,也許這是一個不好的例子。基本上我所說的是 - 對於我想跟蹤的每種可能狀態都有一個實體是理想的嗎?所以會有一個用於Guest,另一個用於用戶,也可能是Admins單獨的一個可以說。每個聚合根將具有某些功能/訪問系統其餘部分的方法。 – thatonefreeman

-2
$User = User_Validation_Service->ValidateUserCredentials($user_login) 
      here is the problem ----------------------------------------^ 

應該有;聲明

後應

$User = User_Validation_Service->ValidateUserCredentials($user_login); 
+0

謝謝你的收穫。我只抽象地說。當我輸入它來更好地解釋我正在嘗試做的事情時,我正在編寫它。不過謝謝你。 – thatonefreeman