On peut faire mieux que ça pour éviter d'avoir à le répéter systématiquement.
Dans le router, on le concatène à chaque route dans la condition de la méthode findRoute?
Effectivement ce serait déjà plus efficace, mais il reste un détail que tu n'as pas pris en compte, ici on travail en local, mais quand on va déployer en production, le chemin de dossier ne sera pas le même, il se peut même probablement qu'il n'y ait pas de dossier juste après le nom de domaine mais directement la route. Il faudrait donc pouvoir configurer ça, pour le changer selon notre environnement d'execution.
Dans le fichier de configuration !
{"language":"application/json","content":"{\n\t\"autoloadFolder\": [\n\t\t\"Framework\",\n\t\t\"Controller\",\n\t\t\"Model\",\n\t\t\"Framework/Exception\"\n\t],\n\t\"database\": {\n \"name\": \"Ma base de données\",\n \"dbname\": \"database\",\n \"host\": \"localhost\",\n \"user\": \"user\",\n \"password\": \"pwd\"\n },\n\t\"basepath\" : \"/mvc-php\"\n}","filename":"config.json"}
On va maintenant ajouter un paramètre basepath dans la méthode FindRoute du routeur, par contre on ne va pas concaténer dans l'expression régulière, mais plutôt retirer cette partie de l'url dans httpRequest, ce sera bien plus performant, car tu peux définir cette url retravaillée avant le array_filter et donc ne la définir qu'une seule fois. Si ce traitement se trouve dans le array_filter, il sera répété pour chaque route du fichier de config à vérifier. Pour retirer cette partie, tu peux utiliser str_replace
Et dans ce cas, au lieu de passer httpRequest au array_filter, tu peux lui passer directement une variable $url et une autre $method.
{"language":"application/x-httpd-php","content":"<?php\n\tclass Router\n\t{\n\t\tprivate $_listRoute;\n\t\t\n\t\tpublic function __construct()\n\t\t{\n\t\t\t$stringRoute = file_get_contents('Config/route.json');\n\t\t\t$this->_listRoute = json_decode($stringRoute);\n\t\t}\n\t\t\n\t\tpublic function findRoute($httpRequest, $basepath)\n\t\t{\n\t\t\t$url = str_replace($basepath,\"\",$httpRequest->getUrl());\n\t\t\t$method = $httpRequest->getMethod();\n\t\t\t$routeFound = array_filter($this->_listRoute,function($route) use ($url,$method){\n\t\t\t\treturn preg_match(\"#^\" . $route->path . \"$#\", $url) && $route->method == $method;\n\t\t\t});\n\t\t\t$numberRoute = count($routeFound);\n\t\t\tif($numberRoute > 1)\n\t\t\t{\n\t\t\t\tthrow new MultipleRouteFoundException();\n\t\t\t}\n\t\t\telse if($numberRoute == 0)\n\t\t\t{\n\t\t\t\tthrow new NoRouteFoundException($httpRequest);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn new Route(array_shift($routeFound));\t\n\t\t\t}\n\t\t}\n\t}","filename":"Router.php"}
Il suffit maintenant de passer ce chemin de base au routeur lorsque l'on appelle la méthode findRoute.
{"language":"application/x-httpd-php","content":"<?php\n\t$configFile = file_get_contents(\"Config/config.json\");\n\t$config = json_decode($configFile);\n\n\tspl_autoload_register(function($class) use($config)\n\t{\n\t\tforeach($config->autoloadFolder as $folder)\n\t\t{\n\t\t\tif(file_exists($folder . '/' . $class . '.php'))\n\t\t\t{\n\t\t\t\trequire_once($folder . '/' . $class . '.php');\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t});\n\ttry\n\t{\n\t\t$httpRequest = new HttpRequest();\n $router = new Router();\n $httpRequest->setRoute($router->findRoute($httpRequest,$config->basepath));\n $httpRequest->run($config);\n\t}\n\tcatch(Exception $e)\n\t{\n $httpRequest = new HttpRequest(\"/Error\",\"GET\");\n $router = new Router();\n\t\t$httpRequest->setRoute($router->findRoute($httpRequest,$config->basepath));\n\t\t$httpRequest->addParam($e);\n $httpRequest->run($config);\n\t}","filename":"index.php"}
Et tu peux recharger ta page.
Mais j'ai toujours une erreur... C'est compliqué ton truc.
Est ce que tu as lu l'erreur?
Il me dit que le controleur n'existe pas.
Vérifie dans ta route quel contrôleur est appelée pour le chemin "/"
C'est le controleur Home, mais il n'existe pas?!?
C'est exactement ce que l'erreur te dit, elle ne trouve pas le contrôleur, donc il faut le créer vu qu'il n'existe pas, avec une action Home c'est ce qui est précisé dans la route, et tu peux lui demander d'afficher une vue home et créer aussi cette vue avec l'affichage que tu souhaite.
{"language":"application/x-httpd-php","content":"<?php\n\tclass HomeController extends BaseController\n\t{\n\t\tpublic function Home()\n\t\t{\n\t\t\t$this->view(\"home\");\t\n\t\t}\n\t}","filename":"HomeController.php"}
{"language":"application/x-httpd-php","content":"<h1>Hello</h1>\n<span> Hello World</span>","filename":"home.php"}
J'ai l'impression d'avoir oublié de faire beaucoup de choses...
recharge ta page.
Mais... ça fonctionne parfaitement cette fois ci !
Et oui, cette fois ci le framework fonctionne, on a terminé !
Et bien, j'aurai bien été incapable de faire tout ça sans ton aide.
Oui mais maintenant que c'est terminé, est ce qu'il y a une seule partie du Framework qui t'es obscure ou que tu ne comprend pas.
Non j'ai tout compris, je pense que je serais probablement capable de le refaire par moi même.
N'oublie pas pour autant, c'est une version très simpliste de framework MVC en php, tu pourrais très bien lui apporter de nombreuse améliorations et fonctionnalités supplémentaires si tu le souhaites. A toi de voir selon tes besoins.
Je n'y manquerais pas. une dernière question tout de même, tu pourrais me montrer comment utiliser les modèles dans un contrôleur?
Allez c'est bien parce que c'est toi, on va faire le contrôleur User pour l'authentification. J'ai terminé cette partie