Aller au contenu principal

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 comme createUser(), getUser(), updateUser() et deleteUser(). Ces méthodes effectuent respectivement les opérations CRUD sur les objets User.

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.

remarque

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.

info

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 :

  1. 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.

  2. Elle vérifie si ce setter existe pour l'objet courant ($this) en utilisant la fonction method_exists(). Cette fonction renvoie true si la méthode spécifiée existe pour l'objet donné, et false sinon.

  3. 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.

attention

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.

astuce

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 :

  1. 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.

  2. Dans votre répertoire "Documents" créez le répertoire tp_hydratation.

  3. 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.

  4. Création de la classe Guerrier :

    • Dans un nouveau fichier appelé Guerrier.php, créez la classe Guerrier avec les propriétés id, nom et force.

    • Ajoutez des méthodes set pour chaque propriété et une méthode hydrate pour initialiser les propriétés à partir d'un tableau associatif.

  5. Création de la classe GuerrierManager :

    • Dans un autre nouveau fichier appelé GuerrierManager.php, créez la classe GuerrierManager. Cette classe doit avoir une propriété $dbh pour stocker l'objet PDO.

    • Ajoutez une méthode save qui prend un objet Guerrier 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 son id et retourne un nouvel objet Guerrier hydraté avec ces données.

  6. 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 objet GuerrierManager.

    • Ensuite, essayez de récupérer le guerrier que vous venez d'enregistrer en utilisant la méthode get de GuerrierManager. Affichez quelques-unes de ses propriétés pour vérifier qu'il a été correctement récupéré.

Une solution

Test de mémorisation/compréhension


Qu'est-ce que l'hydratation en programmation orientée objet ?


Que fait un manager de table ?


Pourquoi utiliserions-nous l'hydratation ?


Quel est le rôle de la méthode `hydrate()` en PHP ?


Qu'est-ce qu'un setter dans l'exemple donné ?