Modele MVC en PHP5 - Front Controller
Mise en place d’un Front Controller paramétré en PHP5
Front Controller ?
Dans les applications PHP5, la séparation de notre code en plusieurs couches est devenue primordiale, je me répÚte un peu, mais depuis PHP5, on ne parle plus de scrypt, mais d’application, donc qui dit application dit architecture solide et modulable, c’est pourquoi on à recours au motif de conception comme ceux du GOF qui rescence plusieurs solutions à des problÚmes particuliers. Dans cet article on se consacre à la partie “moteur” de notre application, le Front Controller permettant de charger et d’executer un module. Le notre sera simple et parametré par “module”
Les interfaces en PHP5
Le travail commence, on va définir une interface que nos modules devront implémenter, pourquoi définir cette interface ? tout simplement parce qu’on cherche à créer une application solide modulable et portable.
-
<?php
-
interface Module {
-
public function execModule (HttpRequest $request);
-
}
La classe HttpRequest
Comme on le voit, notre interface “Module” demande une méthode, celle-ci prend en paramÚtre la classe HttpRequest. Cette classe permet la récupération de toutes les requetes passées à notre application et pouvant etre utile à notre module donc on récupérera les tableaux $_POST et $_GET qu’on transmettra à notre méthode par l’intermédiaire de HttpRequest
-
<?php
-
class HttpRequest {
-
private $_request;
-
-
public function __construct () {
-
}
-
public function getParam ($key) {
-
return $this->_request[$key];
-
}
-
}
Le Front Controller
un peu à la maniÚre de nos modules, on va définir ici une nouvelle interface front controller que notre moteur devra implémenter, le principe est le suivant. Dans notre MVC notre Front Controller impose la méthode LoadModule, celle-ci chargera un module implémenté par l’interface Module, donc possédant une méthode execModule, qu’il initialisera ! Voyons un peu le code…
-
<?php
-
interface FrontController {
-
public function loadModule (HttpRequest $request);
-
}
On passe maintenant à l’écriture du la classe Engine, qui implementera Front Controller. Celui-ci traitera donc les requêtes passées à l’application via la classe HttpRequest, notre classe Engine recuperera le paramÚtre module et chargera la classe en rapport à celui-ci…
-
class Engine implements FrontController {
-
public function loadModule (HttpRequest $request) {
-
// récupération du nom du module à charger
-
$moduleName = $request->getParam(“module”);
-
if ($moduleName != ”) {
-
// fichier php intégrant le module
-
$fileName = “~/module.{$moduleName}.php”; // pensez au chemin
-
require_once ($fileName);
-
} else {
-
// génération d’une exception
-
throw new Exception (“Impossible de trouver le module”);
-
}
-
}
-
// instance du module
-
$o = new $moduleName ();
-
// execution du module
-
$o->execModule ($request);
-
} else {
-
throw new Exception (“Le module à executé est invalide”);
-
}
-
}
-
}
Creation d’un simple module
Pour illustrer notre exemple de Front Controller, on va créer un simple module affichant à l’écran le mythique “Hello World !”, On se souvient qu’il devra implémenter l’interface Module et donc disposer d’une action execModule ()
-
class SayHelloWorld implements Module {
-
public function execModule (HttpRequest $request) {
-
echo “Hello World en PHP5 !”;
-
}
-
}
Donc on accede au module via : “http://monsite.com?module=SayHelloWorld” …hum, il serait peut etre interessent de mettre en plus, l’url rewriting, non ? (;
Conclution
Voila un simple Front controller paramétré, il se veut assez simple et modulable, et devra sans doute être modifié afin d’etre integré dans une application plus poussée. on pourra aussi utiliser la classe View vue dans un article précédent pour commencer à avoir une petite approche d’application PHP légÚrement evoluée. De plus une modification du Modele pourrait être d’ajouter une classe i18n permettant l’internationalisation de l’application.
Tableau de bord




18 février 2007 at 19:26
Chapeau !