Utvikling av en dispatcher i ditt eget MVC-rammeverk

La oss huske innholdet i filen index.php for øyeblikket:

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

Som du ser, returnerer ruteren vår for øyeblikket et objekt av klassen Track, som inneholder navnet på kontrolleren, navnet på handlingen og parametrene fra adresselinjen. I tillegg laget vi i forrige leksjon en forelder for alle kontrollerne.

Nå kan vi gjøre det slik at metoden til kontrolleren blir kalt, med dataene som finnes i variabelen vår $track.

Dette vil bli håndtert av en spesiell klasse Dispatcher. Dispatcheren vil motta et objekt av klassen Track og basert på dens data opprette et objekt av den angitte klassen, kalle metoden til denne klassen, og sende parametrene inn i denne metoden.

La oss legge til kall 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 implementasjon av autolasting
  });
  
  $routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
  
  $track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
  
  // Kall til dispatcher:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

Kall til metoden getPage i dispatcheren vår vil kalle metoden render til kontrolleren og returnere det som dette metodekallet returnerer. Som du allerede vet fra forrige leksjon, returnerer metoden render til kontrolleren et objekt av klassen Page.

Her er skjelettet til klassen Dispatcher vår:

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

Bruk mitt skjelett og implementer den beskrevne klassen Dispatcher. Test dens funksjon. Hvis du støter på vanskeligheter, se kildekoden i filene til det pedagogiske rammeverket jeg har laget.