Une route pas si romaine que ça
Voyons maintenant les routes, tu sais ce qu'est une route n'est ce pas?
Ah oui, ça a été construis par les romains pour faciliter les trajets, maintenant on s'en sert principalement pour rouler en voiture. Mais je ne vois pas vraiment le rapport...
Effectivement, ce n'est pas vraiment lié. Ici on parle de route pour les éléments qui vont nous indiquer vers où se diriger. En fait chaque requête http devrais correspondre à une et une seule route, et cette route sait quel contrôleur, quelle action appeler et quels paramètres il faut utiliser.
D'autres informations peuvent aussi être précisées dans les routes, comme des restrictions d'accès, ou des outils spécifique du framework qu'il faut utiliser.
La classe Route
On va construire pour commencer une classe route qui définit le format d'une route.
Ok, donc une classe Route.php avec les propriétés url, controller, action, et params. Et on met tout en private avec des accesseurs.
Pas tout à fait, pour commencer, on va nommer la propriété path, et non par url. Une url c'est le chemin complet avec le protocole et le nom de domaine, nous n'utiliserons que le chemin qui se trouve après le nom de domaine, donc path est plus approprié.D'autre part, les routes seront définies dans un fichier de configuration, puis chargées en objets, mais on ne doit pas permettre de les modifier pour des raisons de sécurité, donc un constructeur, mais pas de setter.
Et je te propose d'ajouter une propriété method, cela nous permettra d'identifier si la requête Http doit être de type GET ou POST par exemple.
{"language":"application/x-httpd-php","content":"<?php\n\tclass Route\n\t{\n\t\tprivate $path;\n\t\tprivate $controller;\n\t\tprivate $action;\n\t\tprivate $method;\n\t\tprivate $param;\n\t\t\n\t\tpublic function __construct($route)\n\t\t{\n\t\t\t$this->path = $route->path;\n\t\t\t$this->controller = $route->controller;\n\t\t\t$this->action = $route->action;\n\t\t\t$this->method = $route->method;\n\t\t\t$this->param = $route->param;\n\t\t}\n\t\t\n\t\tpublic function getPath()\n\t\t{\n\t\t\treturn $this->path;\n\t\t}\n\t\t\n\t\tpublic function getController()\n\t\t{\n\t\t\treturn $this->controller;\n\t\t}\n\t\t\n\t\tpublic function getAction()\n\t\t{\n\t\t\treturn $this->action;\n\t\t}\n\t\t\n\t\tpublic function getMethod()\n\t\t{\n\t\t\treturn $this->method;\n\t\t}\n\t\t\n\t\tpublic function getParam()\n\t\t{\n\t\t\treturn $this->param;\n\t\t}\n\t}","filename":"Route.php"}
Et le fichier de configuration, on le fait sous quel format?
Je te propose JSON, je trouve ce format assez clair et facile à modifier.
JSON n'est pas obligatoirement le format à utiliser, d'autres formats de données peuvent tout à fait convenir aussi, tel que xml ou yaml. C'est à vous de choisir celui qui vous convient le mieux, et il faudra ensuite implémenter la méthode adaptée pour lire le fichier et le transformer en objet.
La configuration des routes
Regarde ce fichier que je te propose, qu'en penses tu?
{"language":"application/json","content":"[{\n\t\"path\" : \"/\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Home\",\n\t\"method\" : \"GET\",\n\t\"param\" : []\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Login\",\n\t\"method\" : \"GET\",\n\t\"param\" : []\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Authenticate\",\n\t\"method\" : \"POST\",\n\t\"param\" : []\n}]","filename":"route.json"}
Effectivement ça a l'air assez clair, par contre tu m'as dit qu'une url ne correspond qu'à une et une seule route, mais là il y a deux fois le chemin /Login dans ton fichier, ça ne va pas poser de problèmes.
Non, c'est pour cela que je t'ai fait ajouter la propriété "method", si tu regarde bien, la première route est en GET, elle nous permettra d'afficher une formulaire d'authentification, la deuxième par contre est en POST, donc lorsque l'utilisateur envoie son formulaire pour s'authentifier. Et elle pourront chacune appeler une action qui correspond à un traitement spécifique.
Ah oui, je comprend mieux maintenant. Mais je ne vois toujours pas comment on va réussir à associer une url à une route.
Et bien nous allons y passer dès maintenant avec le routeur ! J'ai terminé cette partie