2011-07-10 19 views
5

使用MVC模式實現模型時,我的模型應該有多複雜?模型應該有多複雜?

比方說,我有幾張桌子,像這樣:

  • 用戶(ID,密碼,創建...)
  • 電子郵件(USER_ID,電子郵件......)
  • 地址(USER_ID ,地址...)

我有一個名爲UserController的控制器。該控制器應該讓我登錄的用戶,創建用戶等

<!-- language: php --> 
class UserController{ 

    public function create($array){ 
     ... 
    } 

    public function login($email, $password){ 
     ... 
    } 
} 

如果我的模型是非常原始的,通過ORM implemeting只有CRUD操作?這將導致類似的代碼:

<!-- language: php --> 
class UserController{ 

    public function create($array){ 
     $userModel->username = 'blah'; 
     $userModel->blah = 'blah'; 
     $id = $userModel->save(); 

     $emailModel->id = $id; 
     $emailModel->email = "emailhere"; 
     $emailModel->save(); 

     //Do the same for addresses 
    } 

    public function login($email, $password){ 
     ... 
    } 
} 

,或者,我可以有模型比較複雜:

<!-- language: php --> 
UserModel{ 
    public function login($email, $password){ 
     //Do the joining and checking here, then return true or false to the controller 
    } 
} 

然後在我的控制器:

<!-- language: php --> 
userModel->login($mail, $password); 

所以,這是更好的方法?爲了將所有的邏輯加入到模型中,還是應該讓模型只進行基本的CRUD操作?最後,我如何處理表連接?應該在模型內還是在控制器內處理?

乾杯

+0

不是必須擁有登錄方法的用戶,而是系統或身份驗證模型。在登錄之前,用戶對象仍然不存在 –

+1

只需注意:爲什麼你有電子郵件模型?在用戶模型中是否有足夠的電子郵件字段? – Alp

+0

用戶可以在此應用程序中擁有多個與其帳戶相關聯的電子郵件地址。的 – F21

回答

3

大多數人認爲的「肥胖模型,瘦控制器」的模式,和它的作品,從長遠來看更好。

一個很好的經驗法則是將您的模型作爲自己的實體,因爲如果您要將模型移動到不同的框架中,例如它們仍然可以使用。

一個簡單的例子就是在電子商務網站上保存訂單信息。假設您想要保存關於稅收的信息,即訂單上有多少稅。這樣做的一種抽象的方式是...

$tax_amount = $order_amount * (TAX_PERCENTAGE/100);

我們應該在控制器或模型做到這一點?假設我們在控制器中完成了它,那麼......在我們的創建動作和我們的更新動作中,我們將計算稅收,這使得難以維護代碼,並且如果電子商務網站的商業規則發生變化(比如說,我們開始銷售稅免稅企業或海外業務),那麼我們將不得不改變任何控制器,保存訂單信息。

但是,如果我們要在我們的訂單模型中計算稅額,我們將在save()方法中執行一次,這將在編輯和添加訂單時調用。

public function save() { 
    //calculate tax first 
    $q = $this->db->query($sql); 
} 

伊莫,最好在你的模型來執行業務規則,因爲它使更多的可移植的代碼,並遠低於頭痛,當談到維護你的代碼。當然,有人會不同意,這是一個非常主觀的領域。

編輯:

將此應用於你問,想想你是否會永遠需要login()方法其他地方,但你的用戶模型中的具體問題?有可能你可能想把你的模型分成不同的,更具體的模型。但在這種情況下,您可以從您的用戶模型擴展。

怎麼樣,如果你要徹底帶走你的控制器?或者,如果您想以完全不同的方式與您的模型進行交互(例如通過未來的不同框架)。用這種方式思考你的用戶模型中的登錄方法會更好。

就個人而言,我會創造我的模型登錄方法,因爲它是對數據的操作,這就是我們的模型是。我也將創造我的控制器上的loginAction()方法,這將引發我們的模型login()方法和進行任何其他操作(例如,登錄失敗的嘗試/重定向),有在登錄後發生的,它應該是成功的或不成功。一個例子可以loginAction()看起來如下...

class UserController extends GenericController { 
    public function loginAction() { 
     $post = $this->form->getPost(); 
     if(UserModel::login($post)) { 
      //do something 
     } else { 
      //do something else 
     } 
    } 
} 
+0

你是否也可以用user/login給出關於最初問題的建議? – Alp

+0

我也讀過關於「胖模型和瘦身控制器」。所以在我的情況下,我的控制器中的操作應該基本上是我模型中操作的代理?例如,UserController-> login()應該只調用UserModel-> login()? – F21

+0

我編輯了我的答案,在具體問題上給出我的看法 – JamesHalsall

0

將或者可以在應用程序的不同部分重複使用所有的功能應該是accessbile全球範圍內,使得耦合低,沒有必要重新聲明它。

我認爲你需要的授權和/或當前的系統參數的附加模型。 AuthModel可以存儲關於不同授權角色的信息以及SysModel商店應用程序參數,例如默認登錄設置(例如,使用cookie yes或no)。

的登錄方法可以被放置在AuthModel話,這應該是我認爲的好地方。此外,模型負責驗證輸入的數據,因此新用戶的創建應該位於UserModel中。

+0

假設我有一個帶有登錄功能的AuthModel。我需要一起加入電子郵件和用戶以確定是否有有效的帳戶。我是否應該使用ORM與EmailModel和UserModel交談以確定我是否可以登錄?或者我應該使用直接的SQL?我是否應該擁有EmailModel? – F21

+0

你說每個用戶都可以擁有任意數量的電子郵件,這導致了EmailModel的存在。因此,您的'AuthModel:login()'方法需要與UserModel和EmailModel進行通信以確定登錄是否正確。 – Alp