Udvikling af en dispatcher i dit eget MVC-framework

Lad os huske det nuværende indhold af filen index.php:

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

Som du kan se, returnerer vores router for nu et objekt af klassen Track, som indeholder navnet på controlleren, navnet på actionen og parametre fra adresselinjen. Derudover lavede vi i den forrige lektion en forælder til alle controllere.

Nu kan vi gøre det sådan, at der sker et kald til controllerens metode, hvis data er indeholdt i vores variabel $track.

Dette vil blive håndteret af en speciel klasse Dispatcher. Dispatcheren vil modtage et objekt af klassen Track og baseret på dets data oprette et objekt af den angivne klasse, kalde metoden i denne klasse og videregive parametre til denne metode.

Lad os tilføje kaldet til dispatcheren i filen index.php:

index.php<?php
  namespace Core;
  
  error_reporting(E_ALL);
  ini_set('display_errors', 'on');
  
  spl_autoload_register(function($class) {
    // din implementering af autoload
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
  
  // Kald til dispatcher:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

Kaldet til metoden getPage af vores dispatcher vil kalde controllerens metode render og returnere det, som kaldet til denne metode returnerer. Som du allerede ved fra forrige lektion, returnerer metoden render i controlleren et objekt af klassen Page.

Her er udkastet til vores klasse Dispatcher:

/core/Dispatcher.php<?php
  namespace Core;
  
  class Dispatcher
  {
    public function getPage(Track $track)
    {
      ...kode
      return controller -> render(parametre);
    }
  }
?>
Задание 1

Brug mit udkast til at implementere den beskrevne klasse Dispatcher. Test dens funktion. Hvis du har problemer, kan du kigge i kildekoden i filerne fra mit lavede undervisningsframework.