2011-10-14 52 views
0

爲清楚起見考慮一個相當標準的「用戶註冊」功能:MVC和ORM - 哪個模型邏輯去哪裏?

我的ORM(波輪)允許您更改類ormUser,它擴展了ormUserBase,以引入自定義功能。

現在我已經將Propel與MVC框架耦合在一起了,我想知道從最佳實踐的角度出發,應該採用哪種邏輯。

對於我的用戶註冊功能我想創建:

  • 這個RegistrationController - 它使用

  • 的usermodel - 這反過來應該調用類似

  • LoginView
  • LogoutView
  • SignupView
  • ProfileView

用戶數據庫表加上用戶概況,推動已產生的便利方法與這些表來工作。但是現在Propel的標準方法還不夠,我需要擴展功能。

哪裏可以正確地做到這一點?

請問我只延長ormUser新查詢的方法,並把非查詢邏輯在我的usermodel? 或者你會簡單地忽略ormUser和使用的usermodel的一切習慣,根據需要爲我的邏輯調用其它ormTableNameClass -s呢?

我知道在Propel中保留新方法在其他模型和控制器中具有可重用性的好處,但我不確定從「做得正確」的角度來看,因爲它似乎需要業務邏輯來確定結果某些查詢。

UPDATE:Using ORM classes directly from the controller in MVC, bad practice?展示瞭如何一個通常與行走,它在我的腦海裏重疊架構的模型......

+0

這取決於你想添加的功能類型。你能給個例子嗎? –

+0

當然 - 說我想創建一個公開的「顯示用戶配置文件的字母」視圖。我需要分頁邏輯和多個查詢,其中大部分都是Propel原生的,但是讓我們假設它們沒有被完全覆蓋。假設我在查詢本身中需要與數據庫不相關的邏輯。 我將在Propel中創建一個方法,該方法接受分頁的參數,從我的模型執行此方法並正在工作,還是我會在我的模型中完成所有工作? – MattW

+0

在這種情況下,控制器應檢索按字母順序排列的用戶模型列表,並將該列表傳遞給視圖。該視圖然後構建用戶配置文件的實際列表的HTML輸出。我不知道Propel是如何工作的,但不應該將檢索邏輯添加到用戶模型中。理想情況下,您將創建一些與Propel交互的用戶存儲庫類,並且該類將負責從數據庫中檢索用戶對象。 –

回答

0

我來到這個工作從具有配對行走用symfony 1.0好幾年了。也許我還沒有完全理解你的帖子,但我不確定你認爲從Propel中錯過了什麼。

爲了清楚起見,您稱之爲模型的東西,我稱之爲「業務邏輯」或「動作」。該模型至少是我理解行話的方式,是數據庫頂部的數據庫和類層。你的「觀點」是IMO仍然是MVC邏輯/動作部分的一部分。我認爲一個視圖正式引用了不同的東西:呈現動作輸出的輸出層。在Propel中,每個表基本上有三個類:行,對等和查詢(歷史上Propel用戶習慣了兩個,因爲查詢是新的)。該行很簡單 - 只是數據庫行的類表示。對等體用於全表操作,如選擇多行,查詢類是一個新的可鏈接的API,用於在數據庫上運行語句。

因此,在您的每個操作(登錄,註銷等)中,您應該打電話給Propel來完成必要的工作。如果你發現自己的行爲中有大量的代碼,在大多數情況下,它可以被重構爲Propel行或peer。這符合MVC的經驗法則「薄控制器,胖模型」,即試圖保持你的數據庫的東西在控制器苗條。

你應該如何構造的項目依賴於你自己的框架,但我會證明它是這樣的:

RegistrationController - which uses the 

    UserAction - which in turn should call something like 

    LoginAction (rendered by LoginView) 
    LogoutAction (rendered by LogoutView) 
    SignupAction (rendered by SignupView) 
    ProfileAction (rendered by ProfileView) 

    - each of which access the model UserModel 
+0

請您詳細說明UserAction/OtherActions如何與海誓山盟和Propel課程相關?我不確定我是否理解,但我相當肯定他們不是Propel生成的類,而是構建Propel對象並使用它們,將結果返回給Controller? – MattW

+0

正確,Action和View元素是您的框架的一部分,而不是ORM的一部分。一些用例可以由框架生成 - 我相信這些被稱爲「腳手架」(Rails)或「管理生成器」(symfony)。它們通常僅用於特定表格上的列表細節視圖(例如「訂單」)。對於這裏所有的用例,我認爲你會手動編寫這些文件。 (附錄:如果你運行MVC教程,三部曲的各個部分之間的輪廓將變得更加清晰,Jobeet非常好,但只適用於較老版本的symfony。) – halfer

+0

因此,UserAction充當中間層控制器與其可以調用的實際操作之間;它代表了註冊領域內所有與用戶相關的操作的入口。 SomeAction具有所有業務邏輯並使用Propel。在這種情況下,Propel處理實際的模型,數據庫。很酷,我現在明白了我的想法:) - 謝謝。 – MattW