Utveckling av en dispatcher i ditt eget MVC-ramverk
Låt oss komma ihåg det nuvarande innehållet i filen index.php:
<?php
namespace Core;
error_reporting(E_ALL);
ini_set('display_errors', 'on');
spl_autoload_register(function($class) {
// din implementation av autoloading
});
$routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
$track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
?>
Som du ser returnerar vår router för närvarande
ett objekt av klassen Track, som innehåller namn
på kontrollern, namn på action och parametrar från
adressraden. Dessutom skapade vi i föregående
lektion en förälder till alla
kontroller.
Nu kan vi göra så att anropet av kontroller-metoden,
vars data finns i vår variabel $track, sker.
Detta kommer att hanteras av en speciell klass Dispatcher.
Dispatchern kommer att ta emot ett objekt av klassen Track
och enligt dess data skapa ett objekt av den angivna
klassen, anropa metoden i denna klass, och skicka
parametrarna till denna metod.
Låt oss lägga till anropet till dispatchern i filen index.php:
<?php
namespace Core;
error_reporting(E_ALL);
ini_set('display_errors', 'on');
spl_autoload_register(function($class) {
// din implementation av autoloading
});
$routes = require $_SERVER['DOCUMENT_ROOT'] . '/project/config/routes.php';
$track = ( new Router ) -> getTrack($routes, $_SERVER['REQUEST_URI']);
// Anrop till dispatcher:
$page = ( new Dispatcher ) -> getPage($track);
?>
Anropet till vår dispatchers metod getPage
kommer att anropa kontrollerens metod render
och returnera det som anropet till denna metod returnerade.
Som du redan vet från föregående lektion returnerar
kontrollerens metod render ett objekt
av klassen Page.
Här är grunden till vår klass Dispatcher:
<?php
namespace Core;
class Dispatcher
{
public function getPage(Track $track)
{
...kod
return kontroller -> render(parametrar);
}
}
?>
Använd min grund och implementera den beskrivna
klassen Dispatcher. Testa dess funktion.
Vid svårigheter, titta på källkoden
i filerna från mitt gjorda utbildningsramverk.