2

저는 Zendframework로 첫 번째 응용 프로그램을 작성하고 있습니다. 제 질문은 MVC (Model-View-Controller) 아키텍처 패턴에 관한 것입니다.데이터 특정 검사를 수행 할 MVC 모델

현재 데이터베이스 테이블을 참조한 모델이 있습니다. 는 여기에 내가 현재 가지고있는 클래스이다 :

Model_Person 
Model_PersonMapper 
Model_DbTable_Person 

지금, 나는 그물에 많은 예제를 참조하지만, 그들 모두 삽입/업데이트/삭제의 간단한 경우입니다. 내 경우 엔 사람이 존재하는지 확인해야만하고 그렇지 않은 경우 ID를 검색하고 ID를 가져와야합니다 (이드가 돌아 오는 저장 내용을 알고 있지만 정확하게 수행해야하는 것은 아닙니다. 및 예).

간단하지만 그 밖의 다른 모든 경우에 대해 데이터베이스 논리를 어디에 두어야하는지 알고 싶습니다. 어떤 다른 경우에는 다른 테이블이나 다른 테이블을 통한 검사가 필요할 수 있습니다.

Model_XXXXMapper의 모든 특정 기능을 현재 유효성 검사/처리하고자하는 작업과 관련이있는 특정 항목으로 추가해야합니까? 함수처럼 getIdOfThePersonByNameOrInsertIfNotExists() (물론 샘플 이름 !!!)

내 모델에 대한 액세스가 덜 구체적 인 컨트롤러를 사용하여 컨트롤러에 있어야합니까?

즉, 모든 데이터 구체화 기능을 넣거나 확인하려면 어떻게해야합니까?

+0

Zend_Validate_Db_NoRecordExists와 그 자매에 관심이있을 수 있습니다. Zend_Form을 사용하는 경우 폼 요소에이 유효성 검사기를 추가 할 수 있습니다. Zend_Form을 사용하지 않는다면 서비스 레이어에서이 유효성 검사 클래스를 간단히 사용할 수 있습니다.{| } 거짓 공공 기능의 생성 가능한 ($ 데이터) { // true를 반환} – Sudheer

+0

위 내 의견을 무시하십시오 간단한 서비스 클래스는 클래스 Service_Person_Validate 같은 것이 될 수 있습니다. 응답 상자에 그것을 입력하려고했습니다. – Sudheer

답변

1

실제 작업은 컨트롤러가 아닌 모델 개체에서 이루어져야한다고 생각합니다. 모든 선택 /이 person 테이블 시작이 DbTable_Person 객체 될 것이라고 만들고, 같은 것들 :

// DbTable_Person 
// returns sets of or single Person objects 
public function createByName($name) // perhaps throws exception if name already exists 
public function findById($id) 
public function findByName($name) 
public function findHavingAccount($account_id) // references another table 

// controller 
// with your example, like what Galen said, 
// I would let the controller handle this logic 
$person = $person_table->findByName($name); 
if (!$person) { 
    $person = $person_table->createByName($name); 
} 
if (!$person) { throw new Zend_Exception('huh?'); } 
$id = $person->id; // you wanted the ID 
+0

나는 그것이 나에게 달렸다고 어딘가에 읽었다. 그것은 마침내 선호하는 질문 일 뿐이다. 얇은 컨트롤러 대 뚱뚱한 컨트롤러. 당신이 말했듯이, 나는 오히려 모델의 논리를 모델에 유지하려고합니다. 고마워 – Pmax

1

나는 확실히 기능을 검색/작성 기능으로 나눌 것이다.

여기

$personTG = new Model_PersonTableGateway; 
if (!$person = $personTG->findByName($name)) { 

    $person = new Model_Person; 
    $person->name = $name; 
    // other variables 
    $newPersonId = $personTG->create($person); // creates a new person 

} 

내가 table gateway를 사용 ... 기본적인 구현입니다. 당신은 당신의 수업을 TG로 대체 할 수 있습니다.

create() 함수를 사용하면 새로 만든 사람의 아이디 또는 전체 사람의 ​​아이디 만 반환 할 수 있습니다.

+0

컨트롤러 또는 액션/체크를 수행하는 모든 클래스에서 그렇게 할 수 있습니까? 모든 데이터 또는 데이터베이스 로직이 모델에 있어야한다고 생각했습니다. 하지만 괜찮아. – Pmax

+0

그건 컨트롤러에 들어갈거야. 컨트롤러는 모델을 데이터 검색기로 사용하여 뷰에 대한 정보를 준비합니다. 그게 바로 코드가하는 전부입니다. – Galen

0

당신은 Zend_Validate_Db_NoRecordExists와 자매에 관심이있을 수 있습니다. Zend_Form을 사용하는 경우 폼 요소에이 유효성 검사기를 추가 할 수 있습니다. 많은 사람들은 Zend_Form을 사용하여 도메인 모델에 도달하기 전에 데이터의 유효성을 검사하고 필터링합니다.

Zend_Form을 사용하지 않는 경우 서비스 레이어에서이 유효성 검사 클래스를 사용하기 만하면됩니다. 간단한 서비스 클래스는 다음과 같을 수 있습니다.

` 
class Service_Person_Validate 
{ 
    public function creatable($data) 
    { // return true|false 
    } 
}