我几个星期以来就开始开发CakePHP项目了。从一开始我就一直在努力控制内部的代码量。在大多数情况下,控制器具有比模型更多的代码行。通过知道表达式“Skinny controller,fat model”,我现在正在寻找一些方法来将更多代码放入模型中。
此时出现的问题是“在哪里划线”。控制器应该做什么以及模型应该做什么。已经有一些问题/答案,我只是在寻找更实用的解释。例如,我将一个函数放在控制器内部。我认为这段代码的一部分必须并且可以移动到模型中。所以我的问题是:我可以移动到模型中的哪个部分以及控制器中可以保留的内容。
/**
* Save the newly added contacts and family members.
*/
public function complete_contacts()
{
if ($this->request->is('post')) {
if (isset($this->data['FamilyMembers'])) {
$selected_user = $this->Session->read('selected_user');
$family_members = $this->data['FamilyMembers'];
$this->ContactsConnection->create();
foreach ($family_members as $family_member) {
// connection from current user to new user
$family_member['ContactsConnection']['contact_family_member_id'] = $selected_user['id'];
$family_member['ContactsConnection']['nickname'] = $selected_user['first_name'];
$this->ContactsConnection->saveAll($family_member);
// inverted connection from new user to current user
$inverted_connection['ContactsConnection']['family_member_id'] = $selected_user['id'];
$inverted_connection['ContactsConnection']['contact_family_member_id'] = $this->FamilyMember->inserted_id;
$inverted_connection['ContactsConnection']['nickname'] = $family_member['FamilyMember']['nickname'];
$this->ContactsConnection->saveAll($inverted_connection);
}
}
}
}
我应该在FamilyMember模型中创建一个名为“save_new_family_member($ family_member,$ selected_user)”的函数吗?
答案 0 :(得分:2)
就M和C的目的而言
该模型管理应用程序域的行为和数据, 响应有关其状态的信息请求(通常来自 视图),并响应指令改变状态(通常来自 控制器)。
控制器接收用户输入并通过制作启动响应 调用模型对象。控制器接受来自用户的输入 指示模型和视图端口基于此执行操作 输入
我建议你可以通过
$selected_user = $this->Session->read('selected_user');
到您的模型并为模型中的每个内部执行。您可能希望更改有关数据存储方式的规则或对其执行某些转换,Controller应对此视而不见。基本上使用Controller来获取[经常查看]到模型的信息。不要直接从Controller操作模型。简而言之,YES创建您建议的功能:)
有人说,有时候我发现自己处于我的控制器必须做的比我想要的更多的位置,在这种情况下,至少将任务分解为辅助方法,这样你的控制器更易于管理,你可以重用代码在需要的地方。
答案 1 :(得分:1)
你做对了。
你当然可以在模型中创建一些方法并使其变胖:
function updateContactFamilyMemberId($id){}
function updateNickname($nickname){}
...
在我看来,这仍然是正确的,但不必要。