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


How can I use Model functions correctly according to the MVC pattern in CakePHP?

我可以在控制器:

$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) ?

TLDR:

从控制器调用find()是"ok"的,但是最佳实践是将任何/所有find()s放在您的模型中。

如果你养成一个习惯,把你所有的find()放到你的模型中,从长远来看,维护你的代码会容易得多。

解释/例子:

在本例中,作为示例,您可以从一个看似简单的函数开始:
//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()时都必须搜索每个控制器。如果您是作为一个团队进行编程,那么这可能是一场噩梦,并且您几乎肯定会重复代码。

从控制器调用Model->find()是完全可以的。然而,你也需要遵循DRY(不要重复自己)原则。这基本上意味着"不要到处复制粘贴代码"。

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