MVC:什么代码属于模型

时间:2012-02-26 19:26:29

标签: php model-view-controller cakephp

我几个星期以来就开始开发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)”的函数吗?

2 个答案:

答案 0 :(得分:2)

就M和C的目的而言

  

该模型管理应用程序域的行为和数据,   响应有关其状态的信息请求(通常来自   视图),并响应指令改变状态(通常来自   控制器)。

     

控制器接收用户输入并通过制作启动响应   调用模型对象。控制器接受来自用户的输入   指示模型和视图端口基于此执行操作   输入

我建议你可以通过

    $selected_user = $this->Session->read('selected_user');

到您的模型并为模型中的每个内部执行。您可能希望更改有关数据存储方式的规则或对其执行某些转换,Controller应对此视而不见。基本上使用Controller来获取[经常查看]到模型的信息。不要直接从Controller操作模型。简而言之,YES创建您建议的功能:)

有人说,有时候我发现自己处于我的控制器必须做的比我想要的更多的位置,在这种情况下,至少将任务分解为辅助方法,这样你的控制器更易于管理,你可以重用代码在需要的地方。

答案 1 :(得分:1)

你做对了。

你当然可以在模型中创建一些方法并使其变胖:

function updateContactFamilyMemberId($id){}
function updateNickname($nickname){}
...

在我看来,这仍然是正确的,但不必要。