Commentaires
Très bien, dit moi à quoi va servir cette méthode alors.

Arthur, l'apprenti développeurA afficher une vue?

Oui, mais dans le détail c'est un peu plus que ça. Dans un site tu va généralement avoir un design général avec un certain nombre de fonctionnalité présent sur toute les pages, comme le menu de navigation par exemple. Et dans le contenu de la page, là tu aura un contenu qui varie selon où tu te trouves sur le site.

Arthur, l'apprenti développeurOui ça me parait logique.

Et bien le but de cette méthode view, est dans un premier temps de générer ce contenu dynamique, puis de l'intégrer dans un template plus général, que l'on nommera layout.

Arthur, l'apprenti développeurAh c'est ça un layout? J'en avais déjà entend parler, mais je n'ai jamais vraiment compris ce que c'était.

Et bien oui c'est ça un layout. je te propose que l'on en crée un très simple pour commencer, avec une architecture html classique.

{"language":"application/x-httpd-php","content":"<!doctype html>\n<html lang=\"fr\">\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>Titre de la page</title>\n\t</head>\n\t<body>\n\t\t//le contenu\n\t</body>\n</html>","filename":"layout.php"}


Arthur, l'apprenti développeurComme ça?

Oui, tu va juste ajouter dans le body l'affichage d'une variable $content. Et je vais te donner une petite astuce très pratique pour le vue, le short tag php.

Arthur, l'apprenti développeurC'est comme un bermuda?

Pas vraiment, généralement lorsque tu veux écrire du php, tu l'indique en utilisans le tag <?php

Arthur, l'apprenti développeurOui

Et bien il existe deux autre tag possible pour faire du php :


  • "<?" qui est identique à "<?php" mais que je te déconseille d'utiliser, car elle peut être source d'erreur.

  • "<?=" qui est identique à "<?php echo" donc très pratique dans les vue, car on va principalement y faire de l'affichage avec php.


En fait ces deux lignes de php font exactement la même chose :

{"language":"application/x-httpd-php","content":"<?php echo $variable; ?>\n<?= $variable ?>","filename":"exemple"}


Arthur, l'apprenti développeurAh c'est pas mal. Je modifie le layout alors.

{"language":"application/x-httpd-php","content":"<!doctype html>\n<html lang=\"fr\">\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>Titre de la page</title>\n\t</head>\n\t<body>\n\t\t<?= $content; ?>\n\t</body>\n</html>","filename":"layout.php"}


Arthur, l'apprenti développeurMais je pense à un truc, si on affiche la vue et ensuite le template, il vont être l'un après l'autre non?

En effet, on va utiliser la mise en mémoire tampon pour ça, c'est très simple et pratique à utiliser.
Le concept est simple, on utilise ob_start() pour indiquer que l'on veux mettre l'affichage en mémoire au lieu de l'envoyer au navigateur. puis ob_get_clean pour récupérer le contenu générer, et effacer le tampon. Il faudra bien penser à enregistrer ce contenu dans une variable.

A l'intérieur de cette mise en mémoire tampon, il suffira de passer les variables et tout simplement d'inclure la vue que l'on souhaite utiliser, et qui sera dans le dossier View.

Arthur, l'apprenti développeurMais pour passer les variables à la vue on fait comment avec include?

Il n'y a pas vraiment de manière de "passer" des variables à une vue, l'instruction include va permettre au fichier qui est inclus d'accéder aux variables déjà définit dans la portée où se trouve l'include. Par contre il y a une petite astuce, étant donné que nos paramètres seront sous format de tableau dans le base contrôleur, on peut utiliser extract pour les extraire et qu'une variable soit créée pour chaque case du tableau.

{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\t\n\t\tpublic function __construct($httpRequest)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t}\n\t\t\n\t\tpublic function view($filename)\n\t\t{\n\t\t\tob_start();\n\t\t\textract($this->_param);\n\t\t\tinclude(\"View/\" . $filename . \".php\");\n\t\t\t$content = ob_get_clean();\n\t\t}\n\t\t\n\t\tpublic function bindManager()\n\t\t{\n\t\t\t\n\t\t}\n\t}","filename":"BaseController.php"}


Deux petits détails en plus, premièrement, il faudrait tout de même vérifier que le fichier existe bien avant de l'inclure, sinon, on risque d'avoir une erreur! Et ensuite, il faut aussi penser à intégrer le layout.

Arthur, l'apprenti développeurOui je fais ça

{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\t\n\t\tpublic function __construct($httpRequest)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t}\n\t\t\n\t\tpublic function view($filename)\n\t\t{\n\t\t\tif(file_exists('View/' . $filename . '.php'))\n\t\t\t{\n\t\t\t\tob_start();\n\t\t\t\textract($this->_param);\n\t\t\t\tinclude(\"View/\" . $filename . \".php\");\n\t\t\t\t$content = ob_get_clean();\n\t\t\t\tinclude(\"View/layout.php\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new ViewNotFoundException();\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic function bindManager()\n\t\t{\n\t\t\t\n\t\t}\n\t}","filename":"BaseController.php"}


Arthur, l'apprenti développeurJe me suis souvenu des exceptions, je me suis dit que je pouvais en ajouter une ici, j'ai bien fait?

Tout à fait, c'est exactement ce qu'il fallait faire. Une dernière chose, je pense qu'il faudrait changer l’accessibilité de la méthode view. C'est une méthode qui ne doit pas être utilisé n'importe où, mais uniquement dans les controleurs qui héritent du BaseController. Tu proposerais quoi?

Arthur, l'apprenti développeurJe ne connais que public et private, donc private.

Et bien non, si tu met la méthode en private, elle ne sera accessible que dans le BaseController, mais pas dans les contrôleurs qui en héritent. Il existe un troisième mot-clé pour l'accessibilité qui est protected, il fonctionne exactement comme private, à l'exception que les classes qui en héritent y ont aussi accès.

Arthur, l'apprenti développeurOk on le change en protected alors.

Oui, et maintenant que la méthode view est faite, je te propose que l'on ajoute une autre méthode dans ce BaseController, l'ajout d'un paramètre à la liste des param, avec pour chaque, un nom et une valeur.

{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\t\n\t\tpublic function __construct($httpRequest)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t}\n\t\t\n\t\tprotected function view($filename)\n\t\t{\n\t\t\tif(file_exists('View/' . $filename . '.php'))\n\t\t\t{\n\t\t\t\tob_start();\n\t\t\t\textract($this->_param);\n\t\t\t\tinclude(\"View/\" . $filename . \".php\");\n\t\t\t\t$content = ob_get_clean();\n\t\t\t\tinclude(\"View/layout.php\");\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new ViewNotFoundException();\t\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic function bindManager()\n\t\t{\n\t\t\t\n\t\t}\n\t\t\n\t\tpublic function addParam($name,$value)\n\t\t{\n\t\t\t$this->_param[$name] = $value;\n\t\t}\n\t}","filename":"BaseController.php"}


On va pouvoir passer à l'accès aux bases de données, on reviendra ensuite sur le bindManager je pense que ce sera plus simple à comprendre une fois que les managers seront créés.
J'ai terminé cette partie
Demander de l'assistance