Desenvolvimento do Dispatcher no seu próprio framework MVC

Vamos lembrar o conteúdo atual do arquivo index.php:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // sua implementação de autoload
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
?>

Como você pode ver, atualmente nosso roteador retorna um objeto da classe Track, contendo o nome do controlador, o nome da ação e os parâmetros da URL. Além disso, na lição anterior fizemos o pai de todos os controladores.

Agora podemos fazer com que ocorra a chamada do método do controlador, cujos dados estão contidos em nossa variável $track.

Isso será feito por uma classe especial Dispatcher. O dispatcher receberá um objeto da classe Track e com base em seus dados criará um objeto da classe especificada, chamará o método dessa classe, passando para esse método os parâmetros.

Vamos adicionar a chamada do dispatcher no arquivo index.php:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // sua implementação de autoload
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
  
  // Chamada do dispatcher:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

A chamada do método getPage do nosso dispatcher chamará o método render do controlador e retornará o que a chamada desse método retornou. Como você já sabe da lição anterior, o método render do controlador retorna um objeto da classe Page.

Aqui está o esboço da nossa classe Dispatcher:

/core/Dispatcher.php<?php
  namespace Core;
  
  class Dispatcher
  {
    public function getPage(Track $track)
    {
      ...código
      return controlador -> render(parâmetros);
    }
  }
?>
Задание 1

Usando meu esboço, implemente a classe Dispatcher descrita. Verifique seu funcionamento. Em caso de dificuldades, consulte o código-fonte nos arquivos do framework educacional que fiz.