Dispatcherin kehittäminen omaan MVC-kehykseesi

Muistetaan tiedoston index.php nykyinen sisältö:

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

Kuten näet, reititin palauttaa meille luokan Track olion, joka sisältää kontrollerin nimen, toiminnon nimen ja parametrit osoiterivistä. Lisäksi edellisessä oppitunnissa teimme kaikkien kontrollereiden yläluokan.

Nyt voimme toteuttaa niin, että kutsutaan kontrollerin metodia, jonka tiedot sisältyvät muuttujaamme $track.

Tästä vastaa erityinen luokka Dispatcher. Dispatcher saa luokan Track olion ja sen tietojen perusteella luo määritetyn luokan olion, kutsuu luokan metodia, välittäen metodille parametrit.

Lisätään dispatcherin kutsu tiedostoon index.php:

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

Dispatcherimme metodin getPage kutsu käynnistää kontrollerin metodin render ja palauttaa sen, mitä kyseisen metodin kutsu palautti. Kuten jo tiedät edellisestä oppitunnista, kontrollerin metodi render palauttaa luokan Page olion.

Tässä on luokkamme Dispatcher runko:

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

Käyttäen luomaani runkoa toteuta kuvattu luokka Dispatcher. Tarkista sen toiminta. Vaikeuksien sattuessa katso lähdekoodia tekemästäni opetuskehyksestä.