如何根据CakePHP中的MVC模式正确使用模型函数?

如何根据CakePHP中的MVC模式正确使用模型函数?,php,cakephp,cakephp-model,Php,Cakephp,Cakephp Model,我可以在控制器中执行此操作吗 $this->User->read(null, $id); $this->User->find('list'); 对吗 我是否正确使用MVC 这些简单功能能否在控制器中使用?或者,我需要在模型中创建这些函数吗?类似于Model->getUser(),并让该函数使用Model->read() 我知道函数是由模型调用的,但是,当我想传递一些参数,函数变大时,例如: $this->User->find('all', array(

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

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

我是否正确使用MVC

这些简单功能能否在控制器中使用?或者,我需要在模型中创建这些函数吗?类似于
Model->getUser()
,并让该函数使用
Model->read()

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

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

我是否可以在控制器中调用此函数,或者需要在模型中创建自定义函数来调用它?像
$this->User->findSomeCustomFunction($param1,$param2,$param3)

从控制器调用
Model->find()
非常好。然而,你也需要遵循干燥(不要重复自己)的原则。这基本上意味着“不要到处复制粘贴代码。”

因此,如果您发现需要从许多控制器操作执行这个精确的
Model->find()
调用,那么将其抽象为针对模型的函数调用被认为是一种良好的做法。因此,是的,控制器将调用
$this->User->findSomeCustomFunction()

TLDR:

从控制器调用
find()
是“ok”的,但是最佳做法是将任何/所有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()
也可以避免每次编写
find()
时都必须搜索每个控制器,以确定是否在其他任何地方使用过类似的
find()
。如果你是作为一个团队进行编程,那可能是一场噩梦,你几乎肯定会复制代码。

要正确使用MVC,你应该摆脱CakePHP。它没有实现MVC设计模式。活动记录实例不是“模型”,模板不是“视图”,控制器只负责更改模型层的状态;但是,就这一点而言,我并不真正理解任何后端阻塞框架是如何实现MVC模式的。例如,我是Django的粉丝,据称这是一个MVC框架。然而,尽管存在“模型”和“视图”,但在Django中很难识别MVC组件。我从未真正使用过CakePHP,但在我有限的接触中,我也对MVC的命名感到困惑。随着Cocoa/iOS的开发,MVC变得清晰起来。视图委托给控制器,控制器反过来与模型一起更新视图。@tereško Ya。。。我不知道Cake是否是MVC框架(对我来说是)。但是现在。。。虽然不是正确的“mvc框架”,但不要将find()放在控制器中。你只会把你的代码弄得乱七八糟,有更多的改变来打破枯燥的概念,让团队中的编程成为噩梦。-我的2美分。@PatrickMaciel-Np!很高兴我能说服你:)我真的认为你会更高兴长期维护你的代码。很好的提示,每个人都很感激。