2012-02-26 1 views
2

저는 몇 주 후부터 CakePHP 프로젝트 개발을 시작했습니다. 처음부터 나는 콘트롤러 안의 코드의 양으로 고심하고 있었다. 컨트롤러는 대부분의 경우 모델보다 많은 코드 행을가집니다. "스키니 컨트롤러, 뚱뚱한 모델"이라는 표현을 알면 모델에 더 많은 코드를 넣을 수있는 방법을 찾기 위해 며칠을 찾고 있습니다.MVC : 어떤 코드가 모델에 속한가

이 시점에서 문제는 "어디에서 선을 그어야합니까?"입니다. 컨트롤러는 무엇을해야하며 모델은 무엇을해야합니까? 이것에 대한 몇 가지 질문/답변이 있습니다. 좀 더 실용적인 설명을 원합니다. 예를 들어 컨트롤러 아래에 함수가 있습니다. 이 코드의 일부는 반드시 모델로 옮겨 져야한다고 생각합니다. 그래서 제 질문은 모델로 이동할 수있는 부분과 컨트롤러에 남아있을 수있는 부분입니다.

/** 
* 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)"?

+1

코드에서는 완벽하게 조작 된 POST 요청을 사용하여 FamilyMember 만 저장할 수 있습니다. 쉘 또는 테스트 케이스와 같은 다른 위치에서 FamilyMember를 만들고 싶다면 어떻게해야할까요? RESTful API 만 제공하는 대신 FamilyMember 모델에 적절한 API를 제공하는 것이 더 합리적 일 것입니다. :) – deizel

+0

주석 주셔서 감사합니다, 나는 그것을 살펴 보겠습니다. –

답변

2

는 지금까지 M의 목적과 C

모델로, (일반적으로 보기에서) 동작과 응용 프로그램 도메인의 데이터 상태에 대한 정보 요청에 응답을 관리 상태 변경 지시에 응답합니다 (보통 컨트롤러에서).

컨트롤러는 사용자 입력을 받고 모델 개체를 호출하여 응답을 시작합니다. 컨트롤러는 사용자로부터의 입력을 받아들이고 은 입력을 기반으로 작업을 수행하도록 모델과보기 포트에 지시합니다.

난 당신이 모델에

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

을 통과하고 모델의 각각의 내부에 대한 귀하을 수행 할 수 있습니다 제안합니다. 데이터가 저장되는 방법에 대한 규칙을 변경하거나 일부 변환을 수행하려고 할 수 있으며 컨트롤러는이를 눈 감아 야합니다. 기본적으로 컨트롤러를 사용하여 [자주보기]에서 모델로 정보를 가져옵니다. 컨트롤러에서 모델을 직접 조작하지 마십시오. 간단히 말해 YES 제안한 함수를 작성하십시오.

가끔 내 컨트롤러가 원하는 것보다 더 많은 작업을 수행해야하는 경우가 있습니다.이 경우 작업을 헬퍼 메소드로 분해해야합니다. 그런 식으로 컨트롤러를 관리하기 쉽고 필요할 때 코드를 재사용 할 수 있습니다.

1

제대로하고 있습니다.

당신은 물론 모델에서 몇 가지 방법을 생성하고 지방으로 할 수 있습니다 : 제 생각에는

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

을 여전히 정확하지만, 불필요 할 것이다.

관련 문제