Ανάπτυξη ενός Dispatcher στο δικό σας MVC Framework

Ας θυμηθούμε το τρέχον περιεχόμενο του αρχείου 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']);
?>

Όπως βλέπετε, μέχρι στιγμής ο router μας επιστρέφει ένα αντικείμενο της κλάσης Track, που περιέχει το όνομα του controller, το όνομα της action και τις παραμέτρους από τη γραμμή διεύθυνσης. Επιπλέον, στο προηγούμενο μάθημα δημιουργήσαμε τον γονέα όλων των controllers.

Τώρα μπορούμε να κάνουμε έτσι ώστε να γίνεται κλήση της μεθόδου του controller, τα δεδομένα του οποίου περιέχονται στη μεταβλητή μας $track.

Αυτό θα το κάνει μια ειδική κλάση Dispatcher. Ο Dispatcher θα λαμβάνει το αντικείμενο της κλάσης Track και βάσει των δεδομένων του θα δημιουργεί ένα αντικείμενο της καθορισμένης κλάσης, θα καλεί τη μέθοδο αυτής της κλάσης, περνώντας σε αυτή τη μέθοδο τις παραμέτρους.

Ας προσθέσουμε την κλήση του Dispatcher στο αρχείο 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']);
  
  // Κλήση του Dispatcher:
  $page  = ( new Dispatcher ) -> getPage($track);
?>

Η κλήση της μεθόδου getPage του Dispatcher μας θα καλεί τη μέθοδο render του controller και θα επιστρέφει ό,τι επέστρεψε η κλήση αυτής της μεθόδου. Όπως ήδη γνωρίζετε από το προηγούμενο μάθημα, η μέθοδος render του controller επιστρέφει ένα αντικείμενο της κλάσης Page.

Εδώ είναι το πρόχειρο της κλάσης μας Dispatcher:

/core/Dispatcher.php<?php
  namespace Core;
  
  class Dispatcher
  {
    public function getPage(Track $track)
    {
      ...κώδικας
      return controller -> render(παράμετροι);
    }
  }
?>
Задание 1

Χρησιμοποιώντας το πρόχειρό μου, υλοποιήστε την περιγραφόμενη κλάση Dispatcher. Ελέγξτε τη λειτουργία της. Σε περίπτωση δυσκολίας, δείτε τον πηγαίο κώδικα στα αρχεία του εκπαιδευτικού framework που έφτιαξα.