Pour bon nombre de petits projets, il n’est pas nécessaire de taper dans les frameworks MVC comme Zend ou Symfony qui sont très lourds et un petit truc maison doit suffire. Je vais essayer de donner quelques tuyaux pour pouvoir faire son MVC maison avec des routes qui dirigent vers les contrôleurs et les actions.
Tout d’abord, il faut créer un fichier index.php à la racine de votre site qui va contenir le lien vers tout ce dont vous avez besoin pour faire vos routes. Ensuite, vous devez créer un dossier controlleur (si vous voulez reproduire la faute de frappe de l’exemple) dans lequel vous aurez tous vos contrôleurs. Vous pouvez éventuellement diviser ce dossier en plusieurs dossiers distincts qui contiendront les différentes parties de votre site. Veillez à appeler vos classes en rapport avec vos règles de is_callable. Dans mon exemple, le chemin vers le dossier est en minuscule et la première lettre du fichier est en majuscule. Par exemple : la classe /controlleur/frontend/index.php sera frontendIndex.
La porte d’entrée du MVC
Contenu de /index.php
<?php
/**
* On inclue d'abord les fichiers nécessaires et on initialise la logique de routes
*/
include("includes/routing.php");
$fmk = new Routes();
include("includes/routes.php");
//Si la route est définie, on récupère la route en question
if (isset($_GET["page"]))
{
$route = htmlentities(trim($_GET["page"]));
}
else
{
$route = "";
}
$fmkRoute = $fmk->getControlleur($route);
if ($fmk->isError404())
{
header("HTTP/1.0 404 Not Found");
}
$controlleur = 'controlleurs/'.$fmkRoute[0];
include($controlleur);
$classe = preg_split('[\.|/]',$fmkRoute[0]);
$classe = $classe[0].ucfirst($classe[1]);
$methodVariable = array($classe, $fmkRoute[1]);
if(is_callable($methodVariable, false, $callable_name)){
call_user_func($methodVariable);
}
PHPRedirection
Ensuite, nous devons rediriger tous les appels de pages vers ce fichier index pour pouvoir traiter les routes.
RewriteEngine On <br />
RewriteBase /<br />
RewriteRule ^index\.html$ index.php?page=/<br />
RewriteRule ^([a-zA-Z0-9-]*\.html)$ index.php?page=$1 [L,QSA]
BashLe routage
Le fichier routing va vous permettre de créer votre interface de routage. Il se trouve chez moi dans /includes/routing.php
<?php
/**
* Classe permettant le routing
*/
class Routes {
/**
* un tableau contenant toutes les données de chaque route
* @var array
*/
private $routes = array();
/**
* un tableau ayant le nom de la route comme clef, qui a comme valeur l'id de la route
* @var array
*/
private $routesName = array();
/**
* un tableau ayant le chemin (URL)) de la route comme clef, qui a comme valeur l'id de la route
* @var array
*/
private $routesPath = array();
/**
* un tableau ayant le contrôleur de la route comme clef, qui a comme valeur l'id de la route
* @var array
*/
private $routesControlleur = array();
/**
* un tableau ayant l'id de la page de la route comme clef, qui a comme valeur l'id de la route
* @var array
*/
private $routesAction = array();
/**
* compteur de routes
* @var integer
*/
private $idRoutes = 0;
/**
* Nom de la route de la page d'accueil
* @var string
*/
private $routeIndexName;
/**
* Chemin de la route de la page d'accueil
* @var string
*/
private $routeIndexPath;
/**
* Contrôleur de la route de la page d'accueil
* @var string
*/
private $routeIndexControlleur;
/**
* Action de la page d'accueil
* @var type
*/
private $routeIndexAction;
/**
* Booléen pour déclarer une URL comme erreur 404
* @var boolean
*/
private $error404 = false;
/**
*
* @param string $routeName
* @param string $urlPath
* @param string $controller
* @param string $action
*/
public function initRoute($routeName, $urlPath, $controller, $action) {
// On remplit les attributs de la class par des tableaux associatifs qui correspondent à l'id d'une route
$this->routesName[$routeName] = $this->idRoutes;
$this->routesPath[$urlPath] = $this->idRoutes;
$this->routesControlleur[$controller] = $this->idRoutes;
$this->routesAction[$action] = $this->idRoutes;
// On remplit un tableau qui à comme clef l'id de la route et comme valeurs les données de la route
$this->routes[$this->idRoutes] = array("name" => $routeName, "path" => $urlPath, "controlleur" => $controller, "action" => $action);
// Le nombre de routes augmente, on met à jour notre id
$this->idRoutes++;
}
/**
*
* @param string $routeName
* @return string
*/
public function urlFor($routeName) {
// Si la route existe, on retourne son URL
if (array_key_exists($routeName, $this->routesName)) {
return "/" . $this->routes[$this->routesName[$routeName]]["path"];
} elseif ($routeName == $this->routeIndexName) { // Sinon, on test si la route correspond à la page d'accueil
return "/" . $this->routeIndexPath;
} else { // Sinon, on retourne une chaîne vide
return "";
}
}
/**
*
* @param string $urlPath
* @return array|bool
*/
public function getControlleur($urlPath) {
// Si l'URL existe, on retourne le contrôleur et l'action associés
if (array_key_exists($urlPath, $this->routesPath)) {
return array($this->routes[$this->routesPath[$urlPath]]["controlleur"], $this->routes[$this->routesPath[$urlPath]]["action"]);
} elseif ($urlPath == null || $urlPath == "" || $urlPath == $this->routeIndexName) { // Si l'URL correspond à la page d'accueil, on retourne son template
return array($this->routeIndexControlleur, $this->routeIndexAction);
} else { // Sinon on déclare une erreur 404
return $this->error404 = true;
}
}
/**
*
* @param string $routeName
* @param string $urlPath
* @param string $template
*/
public function initIndexRoute($routeName, $urlPath, $template) {
$this->routeIndexName = $routeName;
$this->routeIndexPath = $urlPath;
$this->routeIndexControlleur = $template;
$this->routeIndexAction = 'index';
}
/**
* Retourne true s'il y a une erreur 404
* @return boolean
*/
public function isError404() {
if ($this->error404 == true) {
return true;
}
return false;
}
}
PHPEnfin, vous allez devoir définir les routes que vous souhaitez utiliser. Personnellement, j’ai placé ce fichier dans /includes/routes.php. Chaque ligne définit une route :
<?php
// Déclaration de la page d'accueil
$fmk->initIndexRoute("accueil", "", "frontend/accueil.php", "index");
//cette ligne crée une route les arguments sont le nom, l'adresse lisible, le chemin vers le contrôleur et l'action
$fmk->initRoute("realisations", "realisations.html", "frontend/realisations.php", "index");
PHPDans un prochain post, nous verrons comment créer des liens à la volée grâce à ces routes.
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.