Oui très bien
Et bien pour chaque route tu va ajouter une propriété manager, et y préciser quels manager tu souhaite utiliser. Par exemple si tu as besoin du UserManager tu pourras le préciser dans ta route de cette façon :
{"language":"application/json","content":"{\n\t\"path\" : \"/\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Home\",\n\t\"method\" : \"GET\",\n\t\"param\" : [],\n\t\"manager\": [\n\t\t\"User\"\t\n\t]\n}","filename":"route.json"}
J'ai compris
{"language":"application/json","content":"[{\n\t\"path\" : \"/\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Home\",\n\t\"method\" : \"GET\",\n\t\"param\" : [],\n\t\"manager\": []\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Login\",\n\t\"method\" : \"GET\",\n\t\"param\" : [],\n\t\"manager\": [\n\t\t\"User\"\n\t]\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Authenticate\",\n\t\"method\" : \"POST\",\n\t\"param\" : [\n\t\t\"login\",\n\t\t\"password\"\n\t],\n\t\"manager\": [\n\t\t\"User\"\n\t]\n}]","filename":"route.json"}
C'est presque ça, dans la route Login en GET tu va simplement afficher un formulaire de connexion, donc tu n'auras pas besoin de faire de requête en base, par contre dans la route POST là tu va connecter l'utilisateur et donc requêter la base de données avec le manager.
Ah oui tout à fait
{"language":"application/json","content":"[{\n\t\"path\" : \"/\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Home\",\n\t\"method\" : \"GET\",\n\t\"param\" : [],\n\t\"manager\": []\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Login\",\n\t\"method\" : \"GET\",\n\t\"param\" : [],\n\t\"manager\": []\n},\n{\n\t\"path\" : \"/Login\",\n\t\"controller\" : \"Home\",\n\t\"action\" : \"Authenticate\",\n\t\"method\" : \"POST\",\n\t\"param\" : [\n\t\t\"login\",\n\t\t\"password\"\n\t],\n\t\"manager\": [\n\t\t\"User\"\n\t]\n}]","filename":"route.json"}
Il faut aussi penser à ajouter la propriété manager dans l'objet route ainsi qu'un accesseur.
{"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\tprivate $_manager;\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\t$this->_manager = $route->manager;\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\t\n\t\tpublic function getManager()\n\t\t{\n\t\t\treturn $this->_manager;\n\t\t}\n\t}","filename":"Route.php"}
Bien, maintenant le but est d'améliorer le BaseController, pour qu'il puisse avoir en propriété des manager, et qu'il les instancie en fonction de ce qui est paramétré dans la route.
Mais... j'ai accés à la route dans le BaseController?
Oui rappelles toi, on a passé le httpRequest au constructeur du BaseController, et la route est dedans ! Il faudra juste penser à ajouter un accesseur à cette route dans HttpRequest
Ah mais oui, je me souviens maintenant. Je vais ajouter l'accesseur
{"language":"application/x-httpd-php","content":"<?php\n\tclass HttpRequest\n\t{\n\t\tprivate $_url;\n\t\tprivate $_method;\n\t\tprivate $_param;\n\t\tprivate $_route;\n\t\t\n\t\tpublic function __construct()\n\t\t{\n\t\t\t$this->_url = $_SERVER['REQUEST_URI'];\n\t\t\t$this->_method = $_SERVER['REQUEST_METHOD'];\n\t\t}\n\t\t\n\t\tpublic function getUrl()\n\t\t{\n\t\t\treturn $this->_url;\t\n\t\t}\n\t\t\n\t\tpublic function getMethod()\n\t\t{\n\t\t\treturn $this->_method;\t\n\t\t}\n\t\t\n\t\tpublic function getParams()\n\t\t{\n\t\t\treturn $this->_params;\t\n\t\t}\n\t\t\n\t\tpublic function setRoute($route)\n\t\t{\n\t\t\t$this->_route = $route;\t\n\t\t}\n\t\t\n\t\tpublic function bindParam()\n\t\t{\n\t\t\tswitch($this->_method)\n\t\t\t{\n\t\t\t\tcase \"GET\":\n\t\t\t\tcase \"DELETE\":\n\t\t\t\t\tforeach($this->_route->getParam() as $param)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->_param[] = $param;\n\t\t\t\t\t}\n\t\t\t\tcase \"POST\":\n\t\t\t\tcase \"PUT\":\n\t\t\t\t\tforeach($this->_route->getParam() as $param)\n\t\t\t\t\t{\n\t\t\t\t\t\t$this->_param[] = $param;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic function getRoute()\n\t\t{\n\t\t\treturn $this->_route;\t\n\t\t}\n\t}","filename":"HttpRequest.php"}
Attention, cette fois on ne va pas déclaré de propriété dans le BaseController pour les manager, sinon il faudrait en créer une différente pour chaque manager, ou avoir tout un mécanisme de gestion dans un tableau. On va faire plus simple que ça, en créant cette propriété dynamiquement.
Ah... et on fait ça comment.
Exactement de la même façon que l'on a accéder à des propriétés par une variable dans le BaseManager juste avant, sauf que cette fois ci on assigne une valeur.
Par exemple :
{"language":"application/x-httpd-php","content":"<?php\nclass Exemple{\n\t//pas de propriété;\t\n}\n$ex = new Exemple();\n$property = \"PropertyName\";\n\n$ex->$property = \"PropertyValue\";\n\necho $ex->PropertyName; // affiche PropertyValue","filename":"exemple"}
Ah mais c'est super simple en fait
{"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\tforeach($this->_httpRequest->getRoute()->getManager() as $manager)\n\t\t\t{\n\t\t\t\t$this->$manager = new $manager;\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"}
C'est bien ça. mais rappelles toi tout de même, il faut passer un paramètre à la création d'un manager, la source de données qui est dans notre config.
Ah donc il faut que je recharge le fichier de config dans le BaseController pour y avoir accès j'imagine?
Pas du tout, on va éviter de répéter des opérations qui peuvent être coûteuse en performance, le fichier a déjà été chargé, on va le passer en paramètre du constructeur du BaseController comme on l'a fait pour la requête http, et le conserver dans une propriété.
Ah oui effectivement ce sera plus simple.
{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\tprivate $_config;\n\t\t\n\t\tpublic function __construct($httpRequest,$config)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t\t$this->_config = $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\tforeach($this->_httpRequest->getRoute()->getManager() as $manager)\n\t\t\t{\n\t\t\t\t$this->$manager = new $manager($this->_config->database);\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"}
C'est exactement ça. Tant qu'on y est, la requête http, tout comme la config pourrait nous être utile dans les vue occasionnellement, il serait pratique de les passer à toutes les vues, si tu te souviens, tu as la méthode addParam dans ton BaseController pour faire ça, et n'oublie pas de prévoir un tableau vide à la propriété avant de lui ajouter des valeurs.
{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\tprivate $_config;\n\t\t\n\t\tpublic function __construct($httpRequest,$config)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t\t$this->_config = $httpRequest;\n\t\t\t$this->_param = array();\n\t\t\t$this->addParam(\"httprequest\",$this->_httpRequest);\n\t\t\t$this->addParam(\"config\",$this->_config);\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\tforeach($this->_httpRequest->getRoute()->getManager() as $manager)\n\t\t\t{\n\t\t\t\t$this->$manager = new $manager($this->_config->database);\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"}
C'est parfait, n'oublie pas d'appeler la méthode bindParam dans le constructeur du BaseController aussi.
{"language":"application/x-httpd-php","content":"<?php\n\tclass BaseController\n\t{\n\t\tprivate $_httpRequest;\n\t\tprivate $_param;\n\t\tprivate $_config;\n\t\t\n\t\tpublic function __construct($httpRequest,$config)\n\t\t{\n\t\t\t$this->_httpRequest = $httpRequest;\n\t\t\t$this->_config = $httpRequest;\n\t\t\t$this->_param = array();\n\t\t\t$this->addParam(\"httprequest\",$this->_httpRequest);\n\t\t\t$this->addParam(\"config\",$this->_config);\n\t\t\t$this->bindManager();\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\tforeach($this->_httpRequest->getRoute()->manager as $manager)\n\t\t\t{\n\t\t\t\t$this->$manager = new $manager($this->_config->database);\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"}
Il ne reste plus qu'une chose à prévoir avant de réaliser notre premier appel, la gestion des vues et fichiers associés.
J'ai terminé cette partie