2013-04-28 4 views
0

MVC 프레임 워크에서 양식 제출을 처리 할 위치에 대한 의견을 듣고 싶습니다. 컨트롤러에서 로직을 처리하거나 컨트롤러에서 직접 처리 할 모델이 있습니까?MVC 디자인 패턴 및 양식 처리

이 양식이 등록 양식이라고 가정하면 결국 데이터베이스에 사용자가 생성됩니다.

어떻게 그런 식으로 접근합니까?

나는 그것에 대해 갈 방법은 컨트롤러에서 양식 데이터의 유효성을 검사하고 데이터로 사용자 모델을 만들고 데이터베이스에 저장하는 것입니다. 양식 데이터 구체적으로 다루는 그러나, 내가 본 모델 (컨트롤러는 그것에게 $ _POST 데이터를 전달 양식 모델을로드)과 우려의

+0

글쎄, 만약 당신이 애플의 MVC를 사용한다면, 나는 컨트롤러가 폼 데이터를 파싱하고 그 데이터로 모델을 만들어야한다고 말하고 싶다. '전통적인'MVC를 사용한다면 Model이이를 처리해야한다고 말하고 싶습니다. – 11684

+0

어떤 MVC 프레임 워크를 사용하고 있습니까? –

+0

모트 가능성이 높습니다 : [MVC에서 $ _POST 데이터를 처리하는 올바른 방법은 무엇입니까?] (http://stackoverflow.com/q/13359818/727208) –

답변

-1

분리 여기에 키

감사입니다 필요한지 궁금입니다. 그렇게 말하면 컨트롤러는 양식 데이터를 인식하지 않아야합니다. 사실 컨트롤러는 html 형식의 개념을 전혀 가질 필요가 없습니다.

모델은 어떤 양식을 통해 제공하려는 값을 캡슐화해야합니다. 컨트롤러는 모델에 대한 작업을 수행합니다 (예 : 모델에서 데이터베이스로 데이터로드).

각 MVC 프레임 워크는 사용 된 규칙이 약간 다를 것이지만 일반적으로 shoukd는 모든 MVC 프레임 워크에서 true를 유지합니다. (귀하의 코멘트에 응답)

업데이트 :

아니, 그 반대. 양식 데이터는 기본 데이터 저장소 (즉, 데이터베이스)를 삽입/업데이트하는 컨트롤러에 전달되는 모델/뷰 모델에 의해 캡슐화되어야합니다. MVC를 고속도로 시스템으로 생각하십시오. 귀하의 모델은 경로를 따라 주행하는 자동차이며 컨트롤러는 트래픽을 지시합니다. 모델은 일반적으로 데이터 필드가있는 단순한 개체이며 컨트롤러는 해당 데이터로 작업을 수행합니다. 모델/뷰 모델은 데이터베이스 데이터와 별개입니다. 모델은 귀하가보기 (프리젠 테이션 레이어)에 기꺼이 보여줄 것입니다. 컨트롤러는 모델을 기본 데이터베이스로 변환해야하지만 데이터베이스는 뷰/모델/컨트롤러와는 별도의 레이어/계층입니다.

+0

그래서 컨트롤러가 모든 처리를 수행하고 사용자 권한을 만드는 양식 모델로 데이터를 전달합니까? – Thomas

+0

내 대답의 업데이트를 참조하십시오. 모든 내용을 주석에 넣을 수 없습니다. – Didaxis

+0

알겠습니다. 고마워요. – Thomas

0

다음은 일반적인 MVC 프레임 워크 중 하나 인 Struts 2이 일반적인 사용자 등록을 처리하는 방법입니다.

Registration Page --Submit--> 
    Filter Dispatcher (Controller) --Struts--> 
     Interceptor --Stack--> Validator --Passed--> 
      Action (Model) 
       --Invokes--> Service/DAO Layer --Persists--> Database 
      Result <--returns-- Action 
     JSP (View) (selected based on result) 
    Interceptor (any post-processing) 
Registration Success HTML 

실제로 컨트롤러를 쓰지는 않습니다. Struts.xml을 사용하여 선언적으로 프레임 워크를 구성한 다음 구성된 MVC 플로우 전체를 오케스트레이션합니다.

Controller은 인터셉터를 통해 유효성 검사를 수행하고 미리 채워지고 유효성이 검사 된 데이터 개체를 모델에 전달하여 데이터베이스에 유지합니다.

public class UserRegistrationAction { 

    private User user = new User(); 

    public User getModel() { // Struts Callback 
     return user; // automatically gets populated with validated values 
    } 

    // This will seem incorrect to someone used to Spring's setter injection but 
    // Struts injects in reverse; pulls the model onto a ValueStack to inject properties 

    public String execute() { 
     // already validated; simply persist 
     UserRegistrationService.getInstance().persist(getUser()); 
     return Action.SUCCESS; 
    } 
    ... 
} 

그렇다면 컨트롤러에서 유효성 검사를 구현하는 것이 맞습니다.

그러나 그 말은 데이터의 처리는 항상 모델에서 발생해야합니다.그들은 자신의 페이스 북 친구 목록 또는 Gmail의 연락처 목록을 가져올 것인지 당신은 또한 사용자에게 물어 봤다 그리고 그들은 합의하고 필요한 세부 정보를 제공한다고 가정 :

public String execute() { 
    user.setContactsList(
     thirdPartyService.getInstance(getPartyCode()).fetchContacts(user.getAuthInfo()) 
    ); 
    UserRegistrationService.getInstance().persist(getUser()); 
    return Action.SUCCESS; 
} 

타사 서비스를 인증하고 다른 가져 오는의 논리 사용자 개체를 유지하기 전에 User 개체를 업데이트하는 세부 정보가 모델에도 저장됩니다. 이는 비즈니스 로직을 구성하고 컨트롤러 (서블릿, 스터드 또는 스프링 MVC)를 구현하는 데 사용하는 기술과 독립적 인 독립 실행 형 모델 클래스로 캡슐화해야하기 때문입니다.

이상적으로 컨트롤러에 대한 교차 절단 문제 (인증, 인증, 캐싱 등) 만 제외하고 핵심 비즈니스 로직을 모델 내에 남겨 두는 것이 이상적입니다.

+0

Xm .... 이것은 본질적으로 디 다크 시스 (Didaxis)가 제안한 것과 정확히 반대이며, 내가 처음부터 염두에 두었던 것입니다. 감사. 다른 사람들의 의견도 감사 할 것입니다. 그러나 매우 숙고 된 설명 – Thomas

+0

@Thomas'getModel()'에 대해 더 잘 설명하기 위해 업데이트되었습니다. 더 많은 답변을 원하시면'java','java-ee'로 질문에 태그하십시오. –

+0

안녕하세요. 기본적으로 저는 PHP 녀석입니다. 그러나 디자인 패턴의 원칙은 언어와 상관없이 동일하다고 생각합니다. 자 그럼 언어에 무관심 해지자. – Thomas