【问题标题】:How can I use Model functions correctly according to the MVC pattern in CakePHP?如何根据 CakePHP 中的 MVC 模式正确使用模型函数?
【发布时间】:2013-03-13 18:10:20
【问题描述】:

我可以在控制器中执行此操作

$this->User->read(null, $id);
$this->User->find('list');

对吗?

我是否正确使用了 MVC?

这些easy功能可以在控制器中使用吗?或者,我需要在模型中创建这些函数吗?喜欢Model->getUser(),并让该功能使用Model->read()

我知道它是由模型调用的函数,但是,当我想传递一些参数时,函数变大了,例如:

$this->User->find('all', array(
    'conditions' => array(
        'User.active' => true,
        'User.group_id' => 3,
        'User.age >=' => 18
    )
));

我可以在Controller中调用这个函数,还是需要在Model中创建一个自定义函数来调用它?喜欢...$this->User->findSomeCustomFunction($param1, $param2, $param3)?

【问题讨论】:

  • 要正确使用 MVC,您应该摆脱 CakePHP。它实现 MVC 设计模式。活动记录实例不是“模型”,模板不是“视图”,控制器只负责改变模型的状态。
  • 我支持@tereško;但是,就此而言,我并不真正了解任何后端阻塞框架如何实现 MVC 模式。比如我是一个 Django 粉丝,据称是一个 MVC 框架。然而,尽管有“模型”和“视图”,但很难辨别 Django 中的 MVC 组件。我从来没有真正使用过 CakePHP,但在我有限的接触范围内,我也对 MVC 的名称感到困惑。有了 Cocoa/iOS 开发,MVC 就一目了然了。视图委托给控制器,控制器反过来与模型一起更新视图。
  • @tereško Ya... 如果 Cake 是 MVC 框架,我不知道(对我来说,它是)。但是现在......虽然不是一个正确的“mvc 框架”?
  • 不要将 find()s 放入控制器中。您只会弄乱您的代码,进行更多更改以打破 DRY 概念,并使团队中的编程成为噩梦。 - 我的 2 美分。
  • @PatrickMaciel - Np!很高兴我能说服你:) 我真的认为从长远来看你会更高兴维护你的代码。

标签: php cakephp cakephp-model


【解决方案1】:

TLDR:

从控制器调用find() 是“可以的”,但是最佳做法是将任何/所有 find() 放入模型中

如果您养成将所有find()s 放在模型中的习惯,那么从长远来看,维护您的代码会容易得多。

说明/示例:

在这种情况下,作为示例,您可以从一个看似简单的函数开始:

//User model
public function getUsers() {
    return $this->find('list');
}

但后来,也许你需要更多类似的东西:

//User model
public function getUsers($opts = array()) {
    $defaults = array(
        'findType' => 'all',
        'activeOnly' => true,
    );
    $params = array_merge($defaults, $opts);
    $qOpts = array('conditions' => array());        

    //active only
    if(!empty($params['activeOnly'])) $conditions[$this->alias.'.active'] = 1;

    return $this->find($params['findType'], $qOpts);
}

(如果有很多方法可以让代码变得更好,请原谅 - 这只是我的想法 - 它给了你这个想法。)

将您的所有find()s 保留在模型中还可以使您不必在每次要编写find() 以确定您是否在其他任何地方使用过类似的find() 时都必须搜索每个控制器。如果您以团队的形式进行编程,那可能是一场噩梦,而且您几乎肯定会重复代码。

【讨论】:

  • 小贴士,大家欣赏。
【解决方案2】:

从控制器调用Model->find() 完全没问题。但是,您还需要遵循 DRY(不要重复自己)原则。这基本上意味着“不要到处复制粘贴代码。”

因此,如果您发现需要从许多控制器操作中进行精确的Model->find() 调用,最好将其抽象为针对模型的函数调用。所以是的,你的控制器会调用$this->User->findSomeCustomFunction()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2021-03-18
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    相关资源
    最近更新 更多