我可以在控制器:
$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()
。