2009-12-23 4 views
1

나는 Kohana MVC 프레임 워크를 사용하여 PHP로 MVC 애플리케이션을 구현하는 데 바쁘다. 하지만 제가 말씀 드리고 싶은 몇 가지 작은 성가심이 있습니다.MVC 사용 개선하기

많은 논리가 컨트롤러와 컨트롤러 자체에서 반복됩니다. 나는 그것에 대해 생각 해왔다. 그리고 나는이 공유 된 논리를 포함하는 객체를 정의하는 것이 현명 할 것이라고 생각 했으므로 반복되지 않는다.

그런 다음 일부 podcast 및 Preventing mission creep in your Views, or, ignorance is bliss에서보기 - 모델에 대해 들었습니다. 그래서 뷰 ​​모델이 제가 찾고 있던 모델입니다.

하지만 이제는 뷰 모델에 무엇을 넣을 까?라는 질문이옵니다. 내 생각은 뷰 모델이 해당 뷰에 필요한 모든 정보를 수집하게했습니다. 이것은 모든 컨트롤러/액션이 입력 데이터를 뷰 모델에 전달한 다음 뷰에 전달하는 것만 큼 장점이 있습니다.

똑똑한 생각인가요? 테스트를 수행 할 때 모델을 뷰 모델에 전달하여 조롱하는 것이 현명합니다. 그러나 저는 모델을 실제로 사용하지 않습니다. 대신 컨트롤러가 Doctrine ORM을 통해 데이터베이스에 액세스하도록했습니다. 모든 쿼리를 별도의 메서드로 변환하는 것은 다소 어색한 것으로 보였지만 어쩌면 내가 누락 된 것일 수 있습니다.

보기 모델에 대해 들었을 때, 그들은 단순한 DTO입니다. 그러나 동적으로 약하게 형식화 된 언어에서 그 이점은 무엇입니까?

어쩌면 나는 완전히 잘못된 길을 걷고 있고 다른 일을해야 할 것입니다. 이것에 대한 당신의 생각은 무엇입니까?

편집 : 나는 올바른 정보를 수집하고 오른쪽 뷰에 전달한다에 대해서 이야기하고 논리의 대부분

.

예 :

고객 컨트롤러가 있습니다. 여기에는 추가 및 편집의 두 가지 작업이 있습니다. 이 두 가지 작업에 대해서는 동일한보기를 사용합니다. 두 조치 모두에서보기에 대해 동일한 변수가 지정됩니다. 추가 조치에서 양식이 유효하지 않으면 입력 변수가 다시보기로 전달됩니다. 편집 작업에서 기존 값은 통과됩니다. 이것은 내가 다루기를 원하는 큰 복제물이다.

답변

2

반복 논리는 일부 리팩토링이 필요하다는 표시이며, 그 리닉이 무엇인지 알려주지 않으므로 리팩토링하는 곳을 확실히 알 수 없지만 직접 반복하지 않는 것이 유용한 원칙입니다. 그래서 독창적 인 생각이 좋다. 컨트롤러에서 DB 로의 직접적인 상호 작용 (예 : 모델의 부족)이 복제의 이유 중 일부인지 궁금합니다.

보기 모델은 DTO 이상입니다. 이들은 비즈니스 데이터를 포함하거나 가리키며 관련 해석 로직을 가지고 있습니다. 당신이 참조한 "mission creep"기사에서 그 아이디어를 볼 수 있습니다. 보기 자체는 링크를 표시할지 여부를 알고 자합니다. 이 결정은 다양한 비즈니스 데이터 조각을 기반으로합니다. 로직을 간단하게 showLink() 메소드에서 가져옵니다. 그러면 뷰는 프리젠 테이션에 집중할 수 있고 viewModel은 해석에 집중할 수 있습니다. 또한 중요한 것은 실제 비즈니스 데이터 자체는 프레젠테이션에 대해 전혀 모릅니다.

+0

예를 추가했습니다. – Ikke

+0

죄송합니다. 추가 및 편집 간의 복제가 이해가 안되며 코드가 정확히 동일하다는 소리를하지 않습니다. – djna

0

컨트롤러의 반복 코드에 대한 이전 단락에 대한 우려 사항을 해결하십시오 ... Kohana를 사용하여 일반적으로 기본 컨트롤러 코드를 기본 컨트롤러에 입력하고 모든 컨트롤러를 상속합니다.

예를 들어 하나의 프로젝트에서 모든 페이지에서 $ this-> auth로 사용 가능한 Auth 모듈에 대한 참조를 만들기 위해 수정 된 버전의 Template_Controller를 사용하고 있습니다.

abstract class Template_Controller extends Controller { 

    /* @var Auth_Core reference to authorization class */ 
    protected $auth; 

    public function __construct() 
    { 
     parent::__construct(); 
     [snip] 
     $this->auth = new Auth(); 
    } 
[...] 
} 

지금 내 모든 컨트롤러는이처럼 시작 :

class Help_Controller extends Template_Controller { 

모든 컨트롤러 따라서 어떤 함수 내에서 $ this-> 인증에 액세스 할 수 있습니다. 비즈 로직을 견해에서 벗어나지 않는 것에 동의하십시오, 그것은 전체 아이디어입니다.

+0

이미 이러한 설정이 있습니다. 템플리트 컨트롤러를 확장하는 애플리케이션 컨트롤러가 있습니다. 그리고 다른 모든 컨트롤러는 애플리케이션 컨트롤러를 확장합니다. 공유 논리의 상당 부분이 이미 한 곳에 집중되어 있습니다. – Ikke