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

时间:2013-03-13 18:10:21

标签: php cakephp cakephp-appmodel

我可以在控制器中执行

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

这是对的吗?

我是否正确使用MVC?

这些 easy 功能可以在Controller中使用吗?或者,我是否需要在模型中创建这些函数?与Model->getUser()一样,并且使用Model->read()

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

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

2 个答案:

答案 0 :(得分:4)

<强> TLDR:

从你的Controller调用find()是“没问题”,但最佳做法是将任何/所有find()放入模型中

如果您养成将所有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()保留在模型中还可以避免每次要编写find()时搜索每个控制器,以确定是否使用了类似的find()其他任何地方。如果你是一个团队编程,这可能是一场噩梦,你几乎可以保证重复代码。

答案 1 :(得分:3)

从Controller调用Model->find()是完全可以的。但是,您还需要遵循DRY(不要重复自己)原则。这基本上意味着“不要在任何地方复制粘贴代码。”

因此,如果您发现需要从许多Controller操作中进行这个精确的Model->find()调用,那么将它抽象为针对Model的函数调用被认为是一种好习惯。所以,是的,您的控制器会调用$this->User->findSomeCustomFunction()