2011-02-28 72 views
3

控制器應該如何瘦?我理解把所有的業務邏輯放在模型中,但其他事情呢。控制器應該如何瘦,模型應該多胖?

例如,假設我正在編寫一個博客網站,每個用戶可以有多個帖子。目前,用戶將通過訪問帖子控制器並運行創建操作來創建帖子。以下是目前會發生的一些小例子。

class Controller_Post extends Controller { 
    function action_create() { 
    if (! empty($_POST)) { 
     $post = new Model_Post; 
     $post->user_id = $this->logged_in_user->id; 
     $post->values($_POST); 
     if (! $post->create()) { 
      echo 'Error'; 
     } 
     else 
     { 
      echo 'Saved'; 
     } 
    } 
    } 
} 

我的問題是,什麼會阻止我把上述邏輯放在用戶模型中,像這樣。

class Model_User extends Model { 
function create_post($post) { 
      $post = Model::factory('post')->values($post); 
    $post->user_id = $this->id; 
    if (! $post->create()) { 
     return FALSE; 
    } 
    else 
    { 
     return TRUE; 
    } 
} 
} 

如果這樣做,控制器會比我放的更小。這對我來說更合理,因爲用戶是創建帖子的用戶,所以我認爲它應該在用戶模型中而不是控制器中。

如果有幫助,我使用Kohana框架。

謝謝

+5

我想你錯了。我所知道的大多數模特都很瘦,而我們的會計部門卻充斥着胖控制器:P – jevakallio 2011-02-28 21:59:22

+0

哈哈,有趣且真實。但是,嚴肅地說,我很好奇控制器應該是多麼瘦。 – BDuelz 2011-02-28 23:46:47

+0

我發現我自己在某些時候只是爲了'控制器是邏輯'而設置了胖控制器,現在我確信這不是要走的路,模型具有某種邏輯並且控制器具有其他邏輯類。我把邏輯放在了對我來說更有意義的地方,而不必關心模型或控制器是否會變胖。如果情況需要一個胖胖的模型,對我來說沒問題。我喜歡zombor a lott的回答。 – Melsi 2011-11-04 23:40:00

回答

4

控制器應該指揮流量。模型適用於您的業務邏輯所在的位置,因此一般而言,第二個示例將是「正確的mvc」。

基本上,控制器應該做的是請求輸入,告訴模型改變狀態(他們自己做實際的狀態改變),並確定顯示哪個視圖(如果有的話)。

我有很多的控制器,其根本是像這樣:

class Controller_Foobar extends Controller 
{ 
    public function action_index() {} 
} 

如果他們需要處理$ _ POST輸入,他們抓住這些數據,並把它送上模型,然後視圖。

保留模型中的所有邏輯可以讓您輕鬆重複使用它,並且更易於維護和測試。

+0

如果您需要數據操作(例如從單獨的日期和時間字段準備時間戳),您是否在控制器中執行此操作,或者您是否將數據從POST傳遞到模型? – BDuelz 2011-03-03 05:58:27

+0

這可能屬於模型。 – zombor 2011-03-03 12:18:43

相關問題