diff --git a/app/kernel/Kernel.php b/app/kernel/Kernel.php new file mode 100644 index 0000000000000000000000000000000000000000..740a2a55c6dd5566509b4ed6283a984c60a172e0 --- /dev/null +++ b/app/kernel/Kernel.php @@ -0,0 +1,40 @@ +<?php + +class Kernel { // création d'une classe PHP qui servira à la gestion des modèles, vues et contrôleurs, selon la requête fournie + + public static function autoload($class) { // méthode qui charge automatiquement un fichier en fonction du nom de la classe passé en paramètre + if(file_exists(ROOT."/app/kernel/$class.php")) { // 1. on vérifie si le fichier voulu existe dans le répertoire contenant les fichiers de classe du noyau + require_once(ROOT."/app/kernel/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction + } + else if(file_exists(ROOT."/app/controller/$class.php")) { // 2. sinon, on fait pareil dans le répertoire contenant les fichiers de contrôleurs + require_once(ROOT."/app/controller/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction + } + else if(file_exists(ROOT."/app/model/$class.php")) { // 3. sinon, on fait pareil dans le répertoire contenant les fichiers de modèles + require_once(ROOT."/app/model/$class.php"); // si c'est le cas, on l'inclut ici et on finit l'exécution de la fonction + } + // si aucun fichier n'a été trouvé, on ne fait rien + } + + + public static function run() { // méthode, appelée pour toute requête de page, qui gère les différents fichiers à appeler + // 1. on commence par enregistrer notre autoload, afin que PHP sache quoi utiliser pour chercher les fichiers et classes dont on aura besoin plus tard + spl_autoload_register(array("Kernel", "autoload")); // on donne dans un tableau la classe qui contient la méthode d'autoload, et le nom de cette méthode (parce qu'on aurait pu lui donner un nom exotique, genre choucroute...) + + // 2. on analyse la requete + $query = isset($_GET["query"]) ? $_GET["query"] : ""; // ternaire. Si la variable $_GET['query'] existe, alors on met sa valeur dans la varaible $query. Sinon, on y met la chaîne vide "". + $route = Router::analyze($query); // on récupère dans un tableau le nom du contrôleur à utiliser, l'action à déclencher dans ce contrôleur, et les paramètres qui restent dans la requête. + // Remarque : ici, on a fait appel à la méthode analyze() de la classe Router, pourtant on n'a pas dit à PHP où la trouver. C'est l'intérêt de l'autoload : à chaque fois que PHP tombe sur une classe qu'il n'a pas en mémoire, il va demander à l'autoload de lui indiquer où la trouver pour l'inclure. Et ça se fait automatiquement ! Elle est pas belle la vie ? :-) + + // 3. on instancie (enfin) le contrôleur adéquat, et on execute l'action demandée + $class = $route["controller"]."Controller"; // variable contenant le nom de la classe qu'on va instancier. Il s'agit du nom du contrôleur donné par la méthode analyze() de Router, concaténé avec "Controller". C'est une contrainte qu'on se donne pour nommer les fichiers de façon uniforme. + if(class_exists($class)) { // on regarde si la classe en question a été définie (va normalement appeler autoload pour essayer de la charger le cas échéant), et si c'est le cas : + $controller = new $class($route); // on instancie la classe + $method = array($controller, $route["action"]); // on définit une variable method qui contient le contrôleur fraichement instancié et l'action à effectuer + if(is_callable($method)) { // si la méthode existe et peut être appelée + call_user_func($method); // alors on appelle la méthode du contrôleur avec l'action souhaitée + } + // il faudra gérer les erreurs : faire une méthode dédiée dans le noyau à appeler ? + // else { error_callable('method'); } ? + } + } +} diff --git a/www/index.php b/www/index.php index 8ce6bd7fbf2c20cbe1b4124e174412d1b96c704c..d51346b319185fb2eede1d174cd4a593f1186aef 100644 --- a/www/index.php +++ b/www/index.php @@ -10,8 +10,8 @@ // => pour le debug : echo $_GET["query"]; die(); (affiche le contenu de $_GET['query'] et termine l'exécution) // -define("ROOT", realpath(__dir__."/..")); // on définit une sorte de variable globale, nommée ROOT, qui contient le répertoire racine de notre site. On s'en servira par la suite lorsque l'on voudra accéder à tel ou tel fichier (vue, controlleur, modèle ou autre... +define("ROOT", realpath(__dir__."/..")); // on définit une sorte de variable globale, nommée ROOT, qui contient le répertoire racine de notre site. On s'en servira par la suite lorsque l'on voudra accéder à tel ou tel fichier (vue, contrôleur, modèle ou autre... -require_once(ROOT . "/app/kernel/Kernel.php"); // première chose à faire : on inclut le fichier noyau, qui va gérer les différentes actions à effectuer (trouver quelle page est demandée, quel controlleur appeler, quelle vue afficher, etc.) +require_once(ROOT . "/app/kernel/Kernel.php"); // première chose à faire : on inclut le fichier noyau, qui va gérer les différentes actions à effectuer (trouver quelle page est demandée, quel contrôleur appeler, quelle vue afficher, etc.) Kernel::run(); // deuxième chose : on lance la méthode run() de la classe Kernel. (oui, c'est de l'objet.)