lessons/php/router.title
Routeur
Un routeur permet de gérer les redirections vers les visuels de chaque page
C'est un objet qui comporte 2 méthodes, une pour enregistrer les infos du chemin vers lequel on veut aller et une autre qui se sert de ces données pour nous amener à la vue correspondante
namespace router;
class Router{
private array $routes;
/**
* La fonction enregistre les informations de la route (la fonction de callback $action)
* dans un tableau ($this->routes) dont la clé est $path
* @param string $path
* @param $action
*/
public function register(string $path, callable|array $action):void{
// $this->routes = tableau
// [$path] = clé
// $action = valeur
$this->routes[$path] = $action;
}
/**
* Elle récupère le nom de dossier de notre projet $_SERVER[REQUEST_URI]
* On l'explode au cas où on aurait un $_GET. On stocke les parties dans un tableau
* Et on récupère le 1er index (sans le $_GET)
* @param $uri
*/
public function resolve(string $uri):mixed{
$path = explode('?', $uri)[0];
//$_SERVER[REQUEST_URI] renvoie la fin de l'url qui se présente comme suit:
// [nom du dossier du projet]/ et on veut seulement ce qui suit le /
$path = str_replace('/[nom du dossier du projet]/', '/',$path);
$action = $this->routes[$path] ?? null;
if(is_callable($action)){
return $action();
}
if(is_array($action)){
[$className, $method] = $action;
if(class_exists($className) && method_exists($className, $method) ){
$class = new $className();
return call_user_func_array([$class, $method], []);
}
}
echo 'la route n\'existe pas';
}
}
Bien sûr, on aura pris soin de définir les routes en amont dans un fichier "routes"
de la manière suivante, par exemple :
define('BASE_VIEW_PATH', __DIR__ . DIRECTORY_SEPARATOR . 'views'. DIRECTORY_SEPARATOR);
use router\router;
$router = new router();
use Controllers\HomeController;
use Controllers\[Contrôleur de votre choix];
$router->register('/', [HomeController::class, 'home']);
$router->register('/[Chemin choisi]', [[Contrôleur de votre choix]::class, '[méthode incluse dans le contrôleur]']);
echo $router->resolve($_SERVER['REQUEST_URI']);