2009-09-17 2 views
0

프론트 컨트롤러를 사용하여 질문이있는 일련의 페이지를 통해 사용자를 보냅니다. 페이지, 질문 및 기타 모든 것이 관리 인터페이스에 설정되고 데이터베이스에 저장되므로 거의 모든 것이 동적이어야합니다.긴 프론트 컨트롤러를 리팩토링하는 방법은 무엇입니까?

세션에 고유 한 식별자를 저장하고 사용자가 데이터베이스에 현재있는 페이지를 저장하여 데이터베이스를 통해 사용자의 진행 상황을 추적하므로 해당 페이지를 보낼 다음 페이지를 파악할 수 있습니다.

문제는 확인해야 할 특별한 경우가 많습니다. 현재 컨트롤러는 300 라인이 넘고 코드는 제대로 작성되지 않았고 필자는 코드를 작성한 사람입니다. 또한 앞으로 몇 주 안에이 시스템에 더 많은 정보를 추가해야 할 것입니다. 예를 들어 사용자 생성 콘텐츠 및 사용자가 어디에서 왔는지에 따라 다른 페이지를 표시 할 수 있습니다.

내가 잘 구성하지 않으면이 컨트롤러가 빠르게 엉망이 될 것입니다.

리팩토링하는 좋은 방법이나 아이디어가 있습니까?

답변

2

일반적으로 URL을 사용하여 클라이언트에 보낼 내용을 결정하는 것이 더 쉽습니다. <form>을 통해 질문을 제출하면 답변을 저장 한 후 다음 질문으로 리디렉션 할 수 있습니다.

<form action="https://stackoverflow.com/questions/14" method="post">... 

이것은 /questions/14에 제출하는 것입니다 당신이 대답을 저장 한 후에는 15 질문을 리디렉션 할 수 있습니다 : 예를 들어이 경우 질문 중 하나는 장소에 URL을 일단

header('Location: /questions/15'); 
exit; 

당신 프런트 컨트롤러를 각 질문과 관련된 부분으로 나눌 수 있습니다. 그렇다면 라우팅 만 있으면됩니다.

if(preg_match('/\/questions\/([0-9]+)/',$_SERVER['REQUEST_URI'],$matches) > 0) 
{ 
    $question_num = (int)$matches[1]; 
    if(!in_array($question_num, $valid_questions)) { 
     // return 404 
    } 

    $controller_name = 'Question_' . $question_num; 
    return new $controller_name; 
} 
else // check for urls that aren't questions ... 
+1

정확하게 맞는 것 같습니다. 각 질문은 자체 컨트롤러 작업이어야합니다. 응답을 처리하고 다음 질문이 무엇이든 리디렉션하십시오. Protip : 특정 답변에서 다음 질문 건너 뛰기가 필요한 경우 마법 번호를 사용하지 마십시오. 대신 $ thisQuestionNum + 2로 리디렉션하십시오. – timdev

+0

고마워요! 나는 조금 다른 방식으로 작업을 수행했습니다. 모든 폼은 여전히 ​​프론트 컨트롤러에 게시됩니다.하지만 이제 모든 페이지 컨트롤러에는 프론트 컨트롤러가 호출하는 handlePost() 메서드가 있습니다. 데이터베이스에서 페이지 컨트롤러 클래스는 템플릿 파일과 함께 저장되지 않으므로 Front Controller는 사용자가 현재있는 페이지를 파악하고, 컨트롤러를로드하고, POST 데이터가 있는지 확인한 다음 페이지를 호출하여 뷰를로드합니다. 프론트 컨트롤러가 300 줄에서 30 줄로 줄었습니다! –

관련 문제