Doctrine : Librairie PHP pour la manipulation et le mapping des données
Doctrine : Librairie PHP pour la manipulation et le mapping des données
-
Objectifs
- Comprendre le rôle de Doctrine en tant que librairie PHP facilitant la manipulation des bases de données et le mapping des objets.
- Apprendre à utiliser Doctrine pour interagir avec les bases de données sans écrire de requêtes SQL et pour mapper les données en objets.
- Identifier les avantages de l’utilisation de Doctrine par rapport à l’utilisation directe de PDO.
- Comprendre le fonctionnement de la couche DBAL pour la manipulation des bases de données et de la couche ORM pour le mapping des objets.
- Acquérir les compétences nécessaires pour intégrer Doctrine dans des projets PHP, notamment dans le cadre du framework Symfony.
-
Présentation
-
Modèles, sans Doctrine
- Lorsqu’on manipule des données stockées en base de données en PHP natif, on utilise généralement l’extension PDO (PHP Data Object), qui fournit une interface orientée objet pour accéder à une base de données avec PHP.
- PDO agit comme une couche d’abstraction entre l’application PHP et un Système de Gestion de Base de Données (SGDB) tel que MySQL, PostgreSQL ou MariaDB, par exemple. Cette abstraction permet de séparer le traitement de la base de données en elle-même.
- Voici un exemple de récupération de données avec PDO :
- Bien que pratique, l’utilisation de PDO présente quelques inconvénients :
- Il faut avoir des compétences en langage SQL pour écrire les requêtes.
- Il est nécessaire d’écrire manuellement les requêtes SQL.
- Par défaut, PDO retourne les données sous forme de tableaux, ce qui peut être moins adapté dans un framework orienté objet comme Symfony.
- Doctrine offre une alternative en permettant d’interagir avec la base de données sans écrire de requêtes SQL, et en récupérant directement des données qui seront mappées en tant qu’objets.
-
Modèles, avec Doctrine
- Avec Doctrine, nous avons trois composants principaux : Doctrine DBAL (Database Abstraction Layer), Doctrine ORM (Object Relational Mapping) et Doctrine Common.
-
Doctrine DBAL :
- Doctrine DBAL est la couche de plus bas niveau de Doctrine, chargée de la communication avec les bases de données relationnelles. Comparable à l’extension PHP PDO, elle offre une abstraction pour interagir avec la base de données.
- Cette surcouche fournit des fonctionnalités telles que la gestion des tables, des champs et des structures de la base de données. Elle expose une API facilitant la manipulation des données sans avoir à écrire de requêtes SQL.
- Par exemple, avec Doctrine DBAL, il est possible de récupérer les trois derniers articles d’un blog sans écrire une seule ligne de SQL. La surcouche fournit des méthodes et des fonctions pour effectuer cette opération.
-
Doctrine ORM :
- Doctrine ORM est la couche d’abstraction qui assure le mapping des objets. Son rôle est de faire correspondre les entités (objets PHP ) aux données stockées en base de données.
- Supposons que la couche DBAL récupère les trois derniers articles de la table « articles », chaque article possédant les champs « id », « title » et « content ». Du côté de Symfony, il serait logique de manipuler des objets de la classe Article, avec des propriétés correspondantes à ces champs.
- Doctrine ORM permet de faire correspondre automatiquement chaque propriété de l’objet Article avec les champs de la table physique en base de données. Ainsi, chaque table est représentée par une entité et le mapping est généralement géré par des annotations ou des attributs PHP .
-
Doctrine Common :
- Doctrine Common est une bibliothèque partagée entre Doctrine DBAL et Doctrine ORM. Elle fournit des fonctionnalités et des interfaces communes utilisées par les deux composants.
- Elle permet d’assurer une cohérence et une compatibilité entre DBAL et ORM, ainsi que de partager du code et des fonctionnalités communs.
- En résumé, Doctrine DBAL assure la manipulation des bases de données, Doctrine ORM gère le mapping des objets, tandis que Doctrine Common fournit des fonctionnalités partagées entre les deux composants. Cela simplifie le développement et la maintenance des applications PHP en adoptant une approche cohérente et orientée objet.
// Connexion à la base de données MySQL
$db = new PDO('mysql:host=localhost;dbname=bdd_demo;charset=utf8', 'root', '');
// Requête SQL pour récupérer tous les articles de la table "articles"
$query = 'SELECT * FROM articles';
// Exécution de la requête SQL
$stmt = $db->query($query);
// Récupération des résultats
$articles = $stmt->fetchAll();