Hydratation
Notions théoriques
Nous allons étudier 3 notions :
- Le CRUD
- Le manager
- L'hydratation
Le CRUD
Dans le domaine du développement Web et des bases de données, les opérations de base pour gérer les données sont souvent regroupées sous l'acronyme CRUD, qui signifie :
- Create (Créer)
- Read (Lire)
- Update (Mettre à jour)
- Delete (Supprimer)
Le manager
Dans le contexte de la programmation orientée objet en PHP, ces opérations CRUD sont généralement encapsulées dans ce qu'on appelle un "manager" (nommé NomtableManager
).
Par exemple, vous pourriez avoir un
UserManager
avec des méthodes commecreateUser()
,getUser()
,updateUser()
etdeleteUser()
. Ces méthodes effectuent respectivement les opérations CRUD sur les objetsUser
.
En complément du manager, pour rendre le code plus souple, on utilise généralement l'hydratation.
L'hydratation
L'hydratation est le processus par lequel on assigne des valeurs aux attributs d'un objet, généralement à partir des données récupérées d'une base de données.
C'est une méthode courante dans la programmation orientée objet, particulièrement utile lorsqu'on travaille avec des objets qui correspondent à des tables dans une base de données.
L'hydratation est donc le processus de remplissage d'un objet avec des données. Un objet qui n'a pas encore été hydraté a été instancié et représente une entité qui ne possède pas encore de données.
désérialisation = instanciation + hydratation
Comment réaliser l'hydratation ?
L'hydratation est réalisée avec une méthode spéciale généralement nommée : hydrate()
.
La méthode hydrate()
est une fonctionnalité très utile dans la programmation orientée objet, principalement lorsqu'il s'agit de travailler avec des objets qui correspondent à des tables.
Le terme "hydrater" signifie littéralement "ajouter de l'eau", mais dans le contexte de la programmation, il fait référence à l'idée d'ajouter ou de remplir un objet avec des données.
Voici une implémentation possible de la méthode hydrate()
.
public function hydrate(array $donnees) {
foreach ($donnees as $key => $value) {
// On récupère le nom du setter correspondant à l'attribut.
$method = 'set'.ucfirst($key);
// Si le setter correspondant existe.
if (method_exists($this, $method)) {
// On appelle le setter.
$this->$method($value);
}
}
}
L'objectif de la méthode
hydrate()
est d'assigner des valeurs aux propriétés de l'objet, à partir d'un tableau associatif (dont les données sont issues d'une table).
Comment fonctionne cette méthode hydrate ?
Cette méthode hydrate()
prend en paramètre un tableau associatif ($donnees
) où les clés correspondent aux noms des attributs de l'objet et les valeurs correspondent aux valeurs que vous souhaitez assigner à ces attributs.
La méthode parcourt ensuite chaque paire clé/valeur du tableau.
Pour chaque paire :
-
Elle construit le nom de la méthode setter correspondante à l'aide de la clé. Par exemple, si la clé est "nom", le nom du setter sera "setNom". La fonction
ucfirst()
est utilisée pour mettre en majuscule la première lettre de la clé, car par convention, les noms des setters commencent par "set" suivi du nom de l'attribut avec la première lettre en majuscule. -
Elle vérifie si ce setter existe pour l'objet courant (
$this
) en utilisant la fonctionmethod_exists()
. Cette fonction renvoietrue
si la méthode spécifiée existe pour l'objet donné, etfalse
sinon. -
Si le setter existe, elle l'appelle avec la valeur correspondante.
$method
est une chaîne contenant le nom de la méthode à appeler, donc $this->$method($value)
appelle effectivement la méthode sur $this
avec $value
comme argument.
Notez l'utilisation du caractère $
devant method
dans la commande $this->$method
afin d'utiliser la valeur d'une variable comme nom de méthode.
En résumé, la méthode
hydrate()
permet d'automatiser l'assignation de valeurs aux attributs d'un objet à partir d'un tableau associatif, en supposant que des méthodes setters appropriées ont été définies pour chaque attribut. C'est une pratique courante dans les applications qui utilisent la programmation orientée objet pour interagir avec une base de données.
La pratique est la clé pour maîtriser une nouvelle compétence. Nous allons donc implémenter un petit projet afin de comprendre le fonctionnement de l'hydratation.
TP pour comprendre l'hydratation
Voici le fichier SQL pour créer la base de données et la table guerriers
qui sera utilisée dans ce TP.
CREATE DATABASE IF NOT EXISTS tp_hydratation;
USE tp_hydratation;
CREATE TABLE IF NOT EXISTS guerriers (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(50),
`force` INT
);
Voici les étapes détaillées pour réaliser le TP :
-
Création de la base de données :
-
Ouvrez votre système de gestion de base de données MySQL (par exemple, phpMyAdmin, MySQL Workbench, ou la ligne de commande MySQL).
-
Copiez et collez le script SQL fourni dans l'interface de votre système de gestion de base de données et exécutez-le pour créer la base de données et la table
guerriers
.
-
-
Dans votre répertoire "Documents" créez le répertoire
tp_hydratation
. -
Création du fichier de configuration :
-
Dans le répertoire
tp_hydratation
, créez un nouveau fichier appeléconfig.php
dans votre répertoire de travail. -
Dans ce fichier, **pour établir une connexion à la base de données MySQL. Assurez-vous de remplacer
'localhost'
,'tp_hydratation'
,'root'
et''
par vos propres valeurs d'hôte, de nom de base de données, d'utilisateur et de mot de passe.
-
-
Création de la classe Guerrier :
-
Dans un nouveau fichier appelé
Guerrier.php
, créez la classeGuerrier
avec les propriétésid
,nom
etforce
. -
Ajoutez des méthodes
set
pour chaque propriété et une méthodehydrate
pour initialiser les propriétés à partir d'un tableau associatif.
-
-
Création de la classe GuerrierManager :
-
Dans un autre nouveau fichier appelé
GuerrierManager.php
, créez la classeGuerrierManager
. Cette classe doit avoir une propriété$dbh
pour stocker l'objet PDO. -
Ajoutez une méthode
save
qui prend un objetGuerrier
en argument et insère ses données dans la base de données. -
Ajoutez une méthode
get
qui récupère un guerrier de la base de données par sonid
et retourne un nouvel objetGuerrier
hydraté avec ces données.
-
-
Test de vos classes :
-
Enfin, dans un fichier
index.php
, incluez tous les fichiers nécessaires (config.php
,Guerrier.php
,GuerrierManager.php
). -
Créez un nouvel objet
Guerrier
, initialisez ses propriétés avec des valeurs de test, puis sauvegardez-le dans la base de données en utilisant un objetGuerrierManager
. -
Ensuite, essayez de récupérer le guerrier que vous venez d'enregistrer en utilisant la méthode
get
deGuerrierManager
. Affichez quelques-unes de ses propriétés pour vérifier qu'il a été correctement récupéré.
-
Une solution
Vous devez être connecté pour voir le contenu.