Ανάπτυξη ενός Dispatcher στο δικό σας MVC Framework
Ας θυμηθούμε το τρέχον περιεχόμενο του αρχείου 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:
<?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:
<?php
namespace Core;
class Dispatcher
{
public function getPage(Track $track)
{
...κώδικας
return controller -> render(παράμετροι);
}
}
?>
Χρησιμοποιώντας το πρόχειρό μου, υλοποιήστε την περιγραφόμενη
κλάση Dispatcher. Ελέγξτε τη λειτουργία της.
Σε περίπτωση δυσκολίας, δείτε τον πηγαίο κώδικα
στα αρχεία του εκπαιδευτικού framework που έφτιαξα.