Lire les contacts avec une requête préparée
Objectif : Récupérer et convertir une liste de contacts depuis la base.
Une liste de contacts ne doit pas être construite dans la page qui l’affiche. Si le code SQL y est mélangé au HTML, il devient plus difficile à tester et à faire évoluer. Vous allez ajouter au dépôt une méthode qui lit les lignes de la table et les transforme en objets Contact.
Le modèle et le dépôt ont déjà été présentés dans les leçons précédentes : Contact porte les règles d’un contact, et ContactDepot prend en charge son stockage. La connexion PDO est déjà injectée dans le dépôt par son constructeur ; elle n’a donc pas à être recréée dans cette méthode.
Préparer et exécuter la lecture
La méthode lister() demande à PDO de préparer un SELECT, puis exécute cette requête. Même si cette première lecture ne comporte pas de valeur fournie par l’utilisateur, conserver les étapes prepare() et execute() rend le rôle du dépôt explicite et prépare l’usage des paramètres liés dans les opérations suivantes.
La requête sélectionne les quatre colonnes utilisées par le carnet et ordonne les résultats par identifiant. L’ordre est ainsi stable d’une exécution à l’autre. Les noms de colonnes doivent correspondre à ceux de la table définie au début du projet : id, nom, courriel et telephone.
Convertir les lignes SQL en objets
Après exécution, fetchAll(PDO::FETCH_ASSOC) fournit une liste de lignes sous forme de tableaux associatifs. Le dépôt parcourt ces lignes et construit un objet Contact pour chacune. La méthode renvoie donc une liste d’objets, et non les tableaux bruts produits par PDO.
Le code ci-dessous complète le fichier contractuel src/Depot/ContactDepot.php. Il conserve la connexion déjà injectée et ajoute une méthode publique. Il suppose l’interface établie pour Contact : un constructeur recevant le nom, le courriel nullable, le téléphone nullable, puis l’identifiant nullable.
<?php
declare(strict_types=1);
namespace Carnet\Depot;
use Carnet\Modele\Contact;
use PDO;
final class ContactDepot
{
public function __construct(
private PDO $connexion
) {
}
/**
* @return list<Contact>
*/
public function lister(): array
{
$requete = $this->connexion->prepare(
'SELECT id, nom, courriel, telephone
FROM contacts
ORDER BY id ASC'
);
$requete->execute();
$lignes = $requete->fetchAll(PDO::FETCH_ASSOC);
$contacts = [];
foreach ($lignes as $ligne) {
$contacts[] = new Contact(
(string) $ligne['nom'],
$ligne['courriel'] !== null ? (string) $ligne['courriel'] : null,
$ligne['telephone'] !== null ? (string) $ligne['telephone'] : null,
(int) $ligne['id']
);
}
return $contacts;
}
}Le commentaire @return list<Contact> précise que le tableau renvoyé est une liste indexée contenant uniquement des objets Contact. PHP ne permet pas de déclarer directement ce type de tableau dans la signature ; le type natif array est donc complété par cette documentation. Les conversions explicites rendent également visible le passage des valeurs récupérées depuis la base vers les types attendus par le modèle.
Vérifier le résultat
Lorsque la table contient deux lignes, l’appel à lister() renvoie deux objets Contact dans l’ordre de leurs identifiants. Si elle est vide, fetchAll() renvoie un tableau vide : la boucle ne s’exécute pas et la méthode renvoie simplement []. Le dépôt ne décide pas du message à présenter dans ce cas ; cette décision appartient au traitement et à l’affichage, qui seront abordés plus tard.
À retenir
- Préparez et exécutez le SELECT dans ContactDepot, qui possède déjà la connexion PDO.
- Récupérez les lignes avec fetchAll(PDO::FETCH_ASSOC), puis convertissez chacune en objet Contact.
- Documentez la liste renvoyée avec @return list et renvoyez un tableau vide si aucun résultat n’est trouvé.
- Laissez au dépôt l’accès aux données et la conversion ; il ne produit pas de HTML.
Dans la leçon suivante, vous compléterez le dépôt avec les opérations d’écriture et la recherche des contacts.