我可以在控制器中执行 :
$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)
?
答案 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()
。