3

나는이에 모습을 촬영 한 :MVC, 프리젠 테이션 모델을 작성하는 가장 좋은 방법은 무엇입니까?

http://r.je/mvc-in-php.html

가에 따르면, 나는 다음과 같은 기본적인 코드가 것 : 이미 도메인 기반 디자인에서 내 응용 프로그램을 구현 한

//Instance of a Model 
$model = new Model(); 

//Controller and View get the Model 
$controller = new Controller($model); 
$view = new View($model); 

//Controller change/work with the Model 
$controller->doSomeAction(); 

//Display the final Model 
$view->display(); 

. 하지만 이제는 기존 MVC에서 구현하려는 프리젠 테이션 레이어에 갇혀 있습니다.

//Get Model 
$model = $myRepository->findById(42); 

//Do Some stuff 
$model->foo = 'foo'; 
$model->bar = 'bar'; 

//View 
$view = new MyView($model) 
$view->render(); 

이드 (42)는 요청에서오고 : 순간

, 내 컨트롤러는 모델의 인스턴스 (위의 코드 잘못된 것 같다) 뷰를 만들 것입니다. 하지만 어떻게 첫 번째 실제 MVC 코드에 따라 그것을 전송할 수 있습니까? 내 말은, 정적 모델이 없다는 것입니다. 모델은 요청에 의해 동적입니다.

class MyPresentationModel extends PresentationModel { 
    public $foo; 
    public $bar; 

    public function __construct($request) { 
     //init myRepo... 
     $obj = $myRepo->findById($request->get(42)); 
     $this->foo = $obj->getFoo(); 
     $this->bar= $obj->getBar(); 
    } 
} 

을 그래서 내 프리젠 테이션 모델을 채우기 위해 가장 좋은 방법은 무엇인가 : 모델이 요청에 대해 알고 있기 때문에이 같은

뭔가 잘못된 느낌?

답변

4

전체 공개 : 나는이 기사의 저자이며,이 URL이 분석에서 참조 인으로 등장했기 때문에 여기에 설명되었습니다 .... 따라서 늦은 답변입니다!

이것은 분리 문제입니다. 요청 객체에 대해 알아야 할 것은 무엇입니까? "요청 개체에 무엇이 들어 있습니까?"라고 묻는다면 그 대답은 쉽습니다. 글쎄, "42"는 사용자가 "그 레코드 42를보고 싶다"는 사용자 액션이라는 것과 같은 ID로 레코드에 대한 정보를 볼 수있는 선택입니다. 이 때문에

, 컨트롤러는 요청 개체에 액세스 할 수 있어야합니다 :

class Controller { 
    private $request, $model; 

    public function ___construct(Model $model, Request $request) { 
     $this->request = $request; 
     $this->model = $model; 
    } 

    public function viewAction() { 
     $this->model->load($this->request->id); 
    } 
} 

모델은 동적 및 요청에 따라 할 수있다, 그러나, 컨트롤러없는 작업 라우터의 일이다 모델을 선택합니다. 그 이유는 융통성이 있기 때문입니다. CSV 파일이나 웹 서비스에서 레코드를로드 한 동일한 API를 사용하여 데이터베이스 또는 모델의 레코드를로드하는 모델을 만들 수 있습니다.이 모델은 모두 세 가지 유형으로 구성 할 수 있습니다. 컨트롤러의 모델은 반복 된 코드로 인해 지저분한 각 모델 옵션에 대한 컨트롤러가 필요하다는 것을 의미합니다.

동일한 내용이보기에도 해당됩니다. 출력을 HTML로 표시하는 뷰와 JSON에서 레코드를 표시하는 뷰, RSS 피드로 다른 뷰 및 PDF로 다른 뷰를 표시 할 수 있습니다. 그러나 그들은 모두 동일한 컨트롤러 및 모델을 사용합니다.

이 모두를 링크하면 MVC의 유연성을 알 수 있습니다.클래스와 함께 :

HTMLView PDFView RSSView

컨트롤러

데이터베이스 모델 CSVModel WebServiceModel

당신은 가능한 옵션의 믿을 수 있습니다

  • A로부터 데이터를 가져 오기 데이터베이스를 HTM으로 표시 L 데이터베이스에서 데이터를 가져 오기 및 데이터베이스에서 PDF로
  • 얻기 데이터를 표시하고 CSV 데이터를 얻기 RSS
  • 로 표시하고 CSV 데이터를 얻기 HTML
  • 로 표시하고 표시
  • 그것은 PDF로 CSV에서 데이터를 가져 오기 및 웹 서비스에서 RSS로
  • 얻기 데이터를 표시하고 웹 서비스에서 데이터를 가져 오기 HTML
  • 로 표시하고 PDF
  • 로 표시
  • 웹 서비스에서 데이터 가져 오기 및 RSS로 표시

모든 재사용 가능한 클래스 집합을 사용하는 동안. 이것은 MVC의 아름다움이며 구성 요소가 분리 된 엔티티 인 이유입니다.

관련 문제