나만의 MVC 프레임워크에서 디스패처 개발하기

현재 파일 index.php의 내용을 다시 떠올려 봅시다:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // 당신의 자동 로드 구현
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
?>

보시다시피, 지금은 우리 라우터가 컨트롤러 이름, 액션 이름 및 주소 표시줄에서의 매개변수를 포함하는 Track 클래스의 객체를 반환합니다. 또한, 이전 강의에서 우리는 모든 컨트롤러의 부모를 만들었습니다.

이제 우리의 변수 $track에 포함된 컨트롤러 메서드를 호출하도록 할 수 있습니다.

이 작업은 특별한 클래스 Dispatcher가 담당할 것입니다. 디스패처는 Track 클래스의 객체를 받아서 그 데이터를 기반으로 지정된 클래스의 객체를 생성하고, 해당 클래스의 메서드를 호출하며, 이 메서드에 매개변수를 전달할 것입니다.

index.php 파일에 디스패처 호출을 추가해 보겠습니다:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // 당신의 자동 로드 구현
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
  
  // 디스패처 호출:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

우리 디스패처의 메서드 getPage를 호출하면 컨트롤러의 메서드 render를 호출하고 이 메서드 호출이 반환하는 것을 반환할 것입니다. 이전 강의에서 이미 알게 되었듯이, 컨트롤러의 render 메서드는 Page 클래스의 객체를 반환합니다.

다음은 우리의 클래스 Dispatcher의 기본 틀입니다:

/core/Dispatcher.php<?php
  namespace Core;
  
  class Dispatcher
  {
    public function getPage(Track $track)
    {
      ...코드
      return 컨트롤러 -> render(매개변수);
    }
  }
?>
Задание 1

제가 준비한 기본 틀을 사용하여 설명된 클래스 Dispatcher를 구현하세요. 작동을 확인하세요. 어려움이 있으면 제가 만든 학습용 프레임워크의 파일에서 소스 코드를 참고하세요.