Commentaires
Alors cette base de données, tu connais une façon pour s'y connecter?

Arthur, l'apprenti développeurJ'ai déjà utilisé PDO, c'est assez simple
Et bien on va l'utiliser nous aussi, mais encore une fois, on va éviter de le répéter dans chaque classe qui appelle la base de données, on va le faire une seule fois.

Arthur, l'apprenti développeurAvec de l'héritage !
Exactement, pour commencer on va créer un dossier Manager dans Model, c'est là que l'on mettra tout les fichiers manager qui accéderont à la base de données.

Arthur, l'apprenti développeurEt il faudra l'ajouter au fichier de config j'imagine, pour que l'autoloader fonctionne !
{"language":"application/x-httpd-php","content":"<?php\n\tclass BDD\n\t{\n\t\tprivate $_bdd;\n\t\t\n\t\tpublic function __construct($config)\n\t\t{\n\t\t\t$this->_bdd = new PDO('mysql:dbname=' . $config->database->dbname . ';host=' . $config->database->host,\n\t\t\t\t\t\t\t\t $config->database->user,\n\t\t\t\t\t\t\t\t $config->database->password);\n\t\t}\n\t\t\n\t\tpublic function getBdd()\n\t\t{\n\t\t\treturn $this->_bdd;\n\t\t}\n\t}","filename":"BDD.php"}


Et on va créer un fichier BDD dans le framework, pour connecter la base de données. N'oublie pas que les informations de connexion sont enregistrées dans le fichier de config. On lui passera plus tard, mais il faut prévoir un paramètre pour qu'on puisse le faire.

Arthur, l'apprenti développeurMais pourquoi on l'appelle BDD et pas BaseManager?
Parce que ce sont deux choses différentes, le fichier BDD nous permettra de nous connecter à la base de données, alors que BaseManager possédera des méthodes pour exécuter des requêtes dans la base. Techniquement on pourrais intégrer la connexion dans le fichier BaseManager, mais pour des raison de performance, on va faire autrement je vais t'expliquer ça. Commence donc par créer ce fichier comme tu le penserais.

{"language":"application/x-httpd-php","content":"<?php\n\tclass BDD\n\t{\n\t\tprivate $_bdd;\n\t\t\n\t\tpublic function __construct($config)\n\t\t{\n\t\t\t$this->_bdd = new PDO('mysql:dbname=' . $config->database->dbname . ';host=' . $config->database->host,$config->database->user,$config->database->password);\n\t\t}\n\t\t\n\t\tpublic function getBdd()\n\t\t{\n\t\t\treturn $this->_bdd;\n\t\t}\n\t}","filename":"BDD.php"}


Alors, ça va fonctionner comme il faut de cette façon, le seul problème est qu'à chaque fois que l'on fait un new BDD() on va créer une nouvelle connexion à la base de données. Il faut savoir que ce nombre de connexion est souvent limité, et si chaque utilisateur se connecte trois, quatre fois ou plus à la base de données à chaque fois qu'il fait une requête Http, cette limite va rapidement être atteinte, bloquant le fonctionnement du site.

On va donc utiliser un singleton. Le mot peut paraître barbare, mais le concept est très simple, il y a 3 modification à faire sur le fichier que tu as fait pour que ce soit bon, Il faut :


  • Passer le constructeur en privé, comme ça il ne pourra être appelé qu'à l'intérieur de la classe et nul par ailleurs.

  • Créer une deuxième propriété statique que l'on nommera instance, cette propriété contiendra un objet BDD créé pour le conserver

  • Ajouter une méthode statique getInstance, si la propriété instance n'est pas renseigné elle va appeler le constructeur et renseigner instance, et dans tout les cas, retourner cette propriété



Arthur, l'apprenti développeurPropriété statique? Méthode statique? hum...
Ah je vais t'expliquer, généralement quand on crée une classe avec des méthodes, tu dois créer une instance de la classe pour pouvoir appeler les méthodes?

Arthur, l'apprenti développeurOui
Et chaque appel a ces méthodes s'appliquera spécifiquement à l'objet qui l'as appelé, on peut même le manipuler grâce à $this

Arthur, l'apprenti développeurOui, jusque là pas de problème
Une méthode ou une propriété statique vont pouvoir être appelées directement depuis le nom de la classe, sans faire référence à aucun objet.

Arthur, l'apprenti développeurMais du coup, $this va représenter quoi?
Rien du tout, si tu utilise $this dans une méthode statique, tu aura une erreur, par contre tu peut utiliser self:: pour faire référence à des propriétés ou d'autres méthodes statiques de la même classe. L'avantage est que le résultat sera le même quelque soit le contexte, donc on pourra récupérer la même unique connexion à la base de données, peut importe à quel endroit on appelle la fonction getInstance.

D'ailleurs le mot clé pour définir une propriété ou méthode statique est "static" il suffit de l'ajouter juste après l'accessibilité de cette propriété ou méthode.

Arthur, l'apprenti développeurOk je pense que j'ai compris
{"language":"application/x-httpd-php","content":"<?php\n\tclass BDD\n\t{\n\t\tprivate $_bdd;\n\t\tprivate static $_instance;\n\t\t\n\t\tpublic static function getInstance()\n\t\t{\n\t\t\tif(empty(self::$_instance))\n\t\t\t{\n\t\t\t\tself::$_instance = new BDD();\n\t\t\t}\n\t\t\treturn self::$_instance->_bdd;\n\t\t}\n\t\tprivate function __construct($config)\n\t\t{\n\t\t\t$this->_bdd = new PDO('mysql:dbname=' . $config->database->dbname . ';host=' . $config->database->host,\n\t\t\t\t\t\t\t\t $config->database->user,\n\t\t\t\t\t\t\t\t $config->database->password);\n\t\t}\n\t\t\n\t\tpublic function getBdd()\n\t\t{\n\t\t\treturn $this->_bdd;\n\t\t}\n\t}","filename":"BDD.php"}


Tu as bien compris, il reste juste trois petits détails pour que ce soit parfait :

  • Tu peux modifier le paramètre du constructeur, seul la config de la bdd nous interesse, pas besoin d'envoyer la config complète. Tu peut le nommer $datasource

  • Vu que la méthode getInstance appelle le constructeur avec un paramètre, il faut pouvoir lui passer, donc il faudra ce paramètre aussi.

  • Pour éviter de récupérer la bdd, il faut retirer l'accesseur, ainsi on est certain de bien récupérer l'instance et de la créer si ce n'est pas le cas en passant par getInstance.



{"language":"application/x-httpd-php","content":"<?php\n\tclass BDD\n\t{\n\t\tprivate $_bdd;\n\t\tprivate static $_instance;\n\t\t\n\t\tpublic static function getInstance($datasource)\n\t\t{\n\t\t\tif(empty(self::$_instance))\n\t\t\t{\n\t\t\t\tself::$_instance = new BDD($datasource);\n\t\t\t}\n\t\t\treturn self::$_instance->_bdd;;\n\t\t}\n\t\tprivate function __construct($datasource)\n\t\t{\n\t\t\t$this->_bdd = new PDO('mysql:dbname=' . $datasource->dbname . ';host=' . $datasource->host,\n\t\t\t\t\t\t\t\t $datasource->user,\n\t\t\t\t\t\t\t\t $datasource->password);\n\t\t}\n\t}","filename":"BDD.php"}


Voilà, maintenant on va pouvoir s'attaquer au BaseManager, rappelle toi il doit prévoir des requêtes de base pour tous nos futurs managers.

Arthur, l'apprenti développeurje ne vois pas du tout comment faire ça... J'ai terminé cette partie
Demander de l'assistance