2011-02-28 83 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

相关问题