2010-05-11 3 views
3

양식 데이터를 처리하는 내 컨트롤러에 몇 가지 컨트롤러가 있습니다. 양식은 AJAX를 사용하며 JSON 인코딩 형식으로 오류를 반환하기 위해 특정 처리를해야하는 여러 컨트롤러에서 꽤 많은 메소드가 있습니다 (아래 코드 참조). 분명히 이것은 DRY가 아니며이 코드를 전 세계적으로 사용할 수있는 단일 도우미 함수로 옮겨야하지만이 코드를 실제로 사용해야하는 곳이 궁금합니다! 이 함수 (예 : Validation :: build_ajax_errors())를 포함하는 정적 도우미 클래스를 생성해야합니까, 아니면이 코드가 응용 프로그램 특정 형식을 사용하고 있고 사용하고있는 jQuery 유효성 검사 플러그인에 연결되어있는 정적 정적이어야합니다. 방법, 예를 들어, 양식 처리 컨트롤러에서 확장 내 주요 웹 사이트 컨트롤러에 저장된?글로벌 헬퍼 기능을 배치 할 위치에 대한 OOP/MVC 조언

   //if ajax request, output errors 
       if (request::is_ajax()) 
       { 
        //need to build errors into array form for javascript validation - move this into a helper method accessible globally 
        $errors = $post->errors('form_data/form_error_messages'); 

        $i = 0; 
        $new_errors = array(); 
        foreach ($errors as $key => $value) 
        { 
         $new_errors[$i][0] = '#' . $key; 
         $new_errors[$i][1] = $value; 
         $new_errors[$i][2] = "error"; 
         $i++; 
        } 

        echo '{"jsonValidateReturn":' . json_encode($new_errors) . '}'; 

        return; 
       } 

답변

2

IMHO, 귀하의 질문은 개인 프로그래밍 스타일의 문제로 귀결됩니다. DRY 보안 주체를 준수하기 위해 리팩터링해야하는 코드를 식별 한 경우 항상 동일한 방식으로 리팩터링하지는 않습니다.

제대로 이해하면 폼 클래스에서이 함수/메서드가 필요하며이 폼 클래스는 모두 동일한 기본 폼 클래스를 확장합니다. 이 경우 문제의 메서드를 수퍼 클래스로 승격시킬 것입니다 (메서드를 "전역 적으로"사용할 수 있기를 바란다는 것을 알고 있습니다). 나머지 유스 케이스는 함수/메서드가 폼 클래스에서 사용됩니다.).

실제로 응용 프로그램에서 사용할 수있는 도우미 기능이 있고 (응용 프로그램을 넣을 다른 곳이 없다는 것을 확실히 알고 있어야 함) 응용 프로그램의 진입 점에 배치합니다. Zend Framework의 MVC를 사용하면 해당 엔트리 포인트는 public index.php가됩니다 (모든 요청은 index.php를 통해 라우트되므로 전역 함수의 논리적 인 위치가됩니다). 이 파일의 맨 아래에 디버깅하는 동안 필자가 타이핑하는 것을 방지하기 위해 항상 도우미 함수를 추가합니다. 예를 들어 "The most useful function you will ever use . . ."을 참조하십시오.

+0

안녕하세요, Jeremy, 당신은 함수의 "글로벌"특성에 대해 옳습니다. 양식 클래스에만 관련이 있습니다. 수퍼 클래스는 실제로 폼 클래스에 의해서뿐만 아니라 많은 다른 클래스들로 확장 된 메인 웹 사이트 컨트롤러입니다. 지금 제 코드를 살펴보면 제너릭 폼 클래스 컨트롤러와 웹 사이트 컨트롤러를 확장하고 특정 폼 기반 컨트롤러로 확장해야합니다. 분명히 모든 형태로 재사용 할 수있는 조각과 조각이 있으므로, 이것들은 제 기능을위한 좋은 장소가 될 일반 폼 컨트롤러로 리팩터링되어야합니다. – franko75

+0

CodeIgniter는 기본적으로 여러분이 할 수있는 함수 라이브러리 인 'Helpers'를 사용합니다 의지대로로드하십시오. 함수는 전역 범위에 포함되며로드 될 때 어디서나 호출 할 수 있습니다. –

관련 문제