2014-01-07 50 views
7

我對如何使用MVC執行插入和更新語句有點困惑。 在你的控制器中創建一個對象的實例並將其傳遞給你的服務來保存它,或者你將數據傳遞給你的服務並處理其中的所有其他事情嗎?MVC - 如何將數據傳遞到服務

插入

在我控制器類似:

$userservice->insert("myname","mypassword"); 

在我UserService

function insert($username,$password){ 
     $user = ORM::for_table('user')->create(); 
     $user->username= $username; 
     $user->password= $password; 
     $user->save(); 
} 

更新

在我控制器類似:

$userservice->update("myname","mypassword",1); 

在我UserService

function insert($username,$password,$id){ 
     $user = ORM::for_table('user')->find($id); 
     $user->username= $username; 
     $user->password= $password; 
     $user->save(); 
} 

這是很好的做法? 因爲我看到很多這樣的答案,例如在控制器中創建用戶並傳遞給存儲庫以進行保存: Proper Repository Pattern Design in PHP? 但我不喜歡在控制器中創建用戶的想法......

回答

7

控制器屬於應用層,只控制活動。在您的示例中,這些活動是針對現有用戶或新用戶的創建和更新。這些操作屬於包含服務的域層。因此,服務將域作爲網守進行封裝,並提供解析域的操作,如正面。

它是確定在您的控制器創建一個對象的實例,並把它傳遞給你的服務,以保存它還是你的數據傳遞到您的服務和處理在那裏一切?

該服務應該提供一種方法來通過ValueObject。 ValueObjects更好地封裝大量數據(用戶的屬性值)。在服務內部,ValueObject應該委託給Filter和Validator。如果驗證沒有失敗,ValueObject將被委託給DataMapper。 DataMapper會將ValueObject的屬性映射到UserRepository的數據模型(ORM)。存儲庫通常需要另一種數據模型,例如,基於像MySQL這樣的RDBMS的對象與存儲介質。

這種方法應該是嚴格分離層之間的關切,以提高可維護性和互換性。服務應該很細,並作爲域對象(過濾器,驗證器等)的委託者,例如參見Service Layer Pattern

那麼,應該在哪裏創建一個值對象?

我希望服務通過使用prototype pattern爲此提供方法:getEntityPrototype()。 請注意命名。 ValueObject是一個沒有身份的對象。 Entity是具有標識的對象(這裏是用戶的標識)。對於現有用戶,您將擁有一個像getUserById($id)這樣的方法,該方法應該返回一個UserEntity。如果用戶對於給定的ID不存在,它應該返回NullObject。要創建一個新的用戶getEntityPrototype()將返回一個沒有身份的用戶實體,所以你將其稱爲ValueObject或更好的實體原型。在設置屬性後(例如通過FormObject)並且保持這個對象是一個真實的實體。在此服務的工廠中,您可以設置EntityPrototype。

+0

好的thx爲這個很好的解釋,但有一個問題:你在哪裏創建你的價值對象?我知道你不應該在你的控制器中創建對象,那麼你如何將它們從控制器傳遞給服務? – randomizer

+0

我添加了一個新的部分'所以,應該在哪裏創建一個值對象?'回答你的問題 – Mamuz

+0

好的,thx爲您的良好反饋。欣賞它。 – randomizer

2

在這種情況下你應該考慮的是如果這些類有只有一個責任

Controller決定了該動作的流程。如果需要註冊一個用戶然後註冊他,但它不應該定義如何去做,但要求一個服務來完成這個任務並得到結果。

另一方面,你應該有某種UserManager更新,創建和提取用戶 - 這是單一的責任?有點,是的 - 它是在廣義上管理它們。

雖然您的方法名稱存在輕微問題。你應該有registerUser而不是insert,因爲它可以更容易地告訴它實際上做了什麼。

+0

你是什麼意思用UserManager來更新,創建,...這就是服務所做的,那麼爲什麼創建一個經理? – randomizer

+0

不同的名字有所不同。 – Uriziel

+0

所以你建議我打電話給我的用戶服務「UserManager」? – randomizer

0

您應該將數據傳遞給模型。 MVC全部是關於分工控制器 - 處理應用程序流程,模型 - 包含所有企業登錄數據庫等和視圖 - 在這裏您決定如何顯示。基本上UI部分存儲在這裏

所以控制器應該發送數據到模型和模型決定如何處理數據。以這種方式編碼的優點是,將來如果您想要更改代碼中的某些內容,您就知道該在哪裏尋找,或者如果您要求設計人員重新設計您的網站,則只需向他提供部分代碼即可。如果設計師做了一些導致錯誤的事情,糾正錯誤不會花費太多時間。如果你正確地遵循MVC添加,更新或維護功能不會是一個問題

+0

我不同意將「所有業務邏輯」放入模型中。這與將其放入控制器中一樣錯誤(或正確)。單獨的MVC就不算什麼了,對於更大的應用程序,您應該考慮添加圖層。 – ckonig

+0

@ckonig對於我來說,模型也是一個由一組文件組成的文件夾,有助於實現業務目標。但我總是覺得我錯過了一些東西,因爲我的目標是不僅在同一個應用程序中重用代碼,而且還在其他應用程序中創建我自己的MVC。如果你能找到反映你對MVC想法的鏈接,我很樂意從中學習。我還在製作大型應用程序,這將幫助我使應用程序更加強大。謝謝..! – Tabby

+0

這兩個是ASP.NET的特定問題,但它們沿着正確的方向發展:http:// stackoverflow。com/questions/235233/asp-net-mvc-should-business-logic-exist-in-controllers和http://stackoverflow.com/questions/7777770/what-is-the-best-place-for-business-當我使用存儲庫時 - 我個人喜歡使用代表數據源(持久性模型)中的數據的模型和隱藏視圖的數據透視性的ViewModels。 – ckonig

相關問題