4

我可以在 Controller 中执行此操作吗:

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

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

4

2 回答 2

4

TLDR:

find()从 Controller调用 a 是“可以的” ,但最佳做法是将任何/所有 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 保存在模型中还可以让您不必在每次想要编写 afind()以确定您是否在find()其他任何地方使用过类似的控制器时都必须搜索每个控制器。如果您作为一个团队进行编程,那可能是一场噩梦,而且几乎可以保证您会重复代码。

于 2013-03-13T20:08:50.843 回答
3

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

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

于 2013-03-13T18:50:48.827 回答