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']);