Doctrine

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 42

L’ORM

(Object-Relational Mapping) :
Doctrine
UP Web
AU: 2020/2021
Plan

1. Introduction
2. Doctrine2
3. Les entités
4. La Migration
5. Entity Manager: Manipuler les entités avec Doctrine2
6. Les relations entres entités avec Doctrine2

2
Introduction
❑ La programmation Orientée Objet, utilisant une base de
données relationnelle, nécessite de convertir les
données relationnelles en objets et vice-versa.

❑ Persistance d’objets métiers : les objets modélisés dans


les applications sont associées à des données stockées
dans les SGBDR

3
Object-Relational Mapping (ORM)
❑ C’est une couche d’abstraction à la base de donnée.
❑ ORM fait la relation entre les données orientées objet et
les données relationnelles.

4
Object-Relational Mapping
❑ Les ORM les plus connus:
En Java: - Hibernate
- JPA (Java Persistance API)
- SimpleORM
En .NET: - Nhibernate
- Entity Framework
Quel choix pour PHP:
- Doctrine
- Propel
- RedBean
5
Object-Relational Mapping
Avantages:
❑ Simplifie l’accès aux données
❑ Facilite le changement de SGBDR
❑ Permet une indépendance du code vis-à-vis du SGBDR utilisé

6
Doctrine

❑ C’est un ORM pour PHP


❑ Logiciel open source
❑ Dernière version stable: 2.7.3
❑ Intégré dans différents Frameworks:
■ Symfony,
■ Zend Framework
■ CodeIgniter

7
Doctrine - Caractéristiques
Une classe qui correspond à chaque table
Une classe = une « Entité »

8
Doctrine – Architecture Technique

9
Architecture Technique de Doctrine
Doctrine - Caractéristiques

On a deux méthodes pour le Mapping:


● Fichier de mapping YAML, XML.
● Directement dans la classe via des annotations

10
Configuration de la base de
données
Configurer la base de données de l’application
dans le fichier .env

11
Création de la base de données

La commande suivante permet de créer une base de données :

php bin/console doctrine:database:create

=>Une base de données avec les propriétés mentionnées dans


.env sera automatiquement générée

12
Les entités
Il existe deux méthodes pour générer les entités :

1. Méthode manuelle (non recommandée)


❑ Créer la classe
❑ Ajouter le mapping
❑ Ajouter les getters et les setters (manuellement ou en utilisant la
commande suivante :
➔ php bin/console make:entity --regenerate App

13
Les entités
2. Méthode en utilisant les commandes

Ajouter une entité en lançant la commande suivante :


➔ php bin/console make:entity
Ajouter les attributs et les paramètres

14
Les entités
Configuration de l’entité:

● @ORM\Id(): spécifie la clé primaire


● @ORM\GeneratedValue(): auto-incrémentée l’ID
● @ORM\Column: s'applique sur un attribut
de la classe et permet de définir les caractéristiques
de la colonne concernée (nom , taille , types, etc.)

15
La Migration
La migration permet de gérer les mises à jours et les évolutions de votre base de
données.
Une image = Une évolution de la base de donnée
La commande ci-dessous nous permet de créer un fichier de migration:
➔ php bin/console make:migration

La commande ci-dessous nous permet de lancer une migration:


➔ php bin/console doctrine:migrations:migrate
La version d’une migration sous forme de «YYYYMMDDHHMMSS »

Le nom de la classe est un timestamp(La valeur représentant la date et l'heure est


appelée timestamp) qui sera stocké dans la base dans une table doctrine_migrations.

16
La Migration

La classe générée possède deux méthodes:

⮚ La méthode up permet, lors de l’exécution de la


commande migrations:migrate d’exécuter les requêtes de migrations vers un
nouveau état

⮚ La méthode down permet de revenir à l’état précédent.

17
La Migration
doctrine:migrations:current Afficher la version actuelle

doctrine:migrations:execute version Exécuter une seule version de migration

doctrine:migrations:generate Créer un fichier de migration vide

doctrine:migrations:latest Afficher la dernière version migration

doctrine:migrations:migrate Exécuter plusieurs version de migrations non


exécutées
doctrine:migrations:status Afficher l'état d'un ensemble de migrations

doctrine:migrations:up-to-date Nous indiquer si le schéma est à jour

doctrine:migrations:version version -- add/delete Ajouter ou supprimer manuellement les versions


de migration de la table des versions.
doctrine:migrations:sync-metadata-storage Garantit que le stockage des métadonnées est à la
dernière version.
doctrine:migrations:list Afficher la liste de toutes les migrations disponibles
et leur état

(*) version: namespace\version


Exemple: DoctrineMigrations\Version20201013084414

18
Entity Manager
❑ EM est un gestionnaire d’entités: le chef d’orchestre de l’ORM
Doctrine

❑ EM est placée entre les objets (entités) et les tables de la base


de données.

❑ EM permet l’insertion, la mise à jour et la suppression des


données de la base de données

19
Manipulation des entités avec
Doctrine2
Tout d’abord, On doit récupérer l’entity manager
➔ $em= $this->getDoctrine()->getManager()

• La méthode persist() signale à Doctrine que l’objet doit être


enregistré. Elle est utilisée que pour un nouvel objet et non pas pour
une mise à jour :
➔ $em->persist($object)

• La méthode flush() permet d'envoyer tout ce qui a été persisté avant


à la base de données, càd mettre à jour la base à partir des objets
signalés à Doctrine
➔ $em->flush()

20
Manipulation les entités avec
Doctrine2
• La méthode remove() indique à Doctrine de supprimer l'entité en
argument de la base de données
➔ $em->remove($object)

• La méthode clear() permet d’annuler tous les persist


➔ $em->clear()

• La méthode detach() permet d’annuler le persist effectué sur


l’entité en argument
➔ $em->detach($object)

21
Création d’un Formulaire
Un formulaire Symfony est l’image d’un objet existant

Insertion: Un formulaire sert à alimenter un objet.

Mise à jour: Un formulaire sert à récupérer des informations


indépendantes de n’importe quel objet.
Pour installer les dépendances du formulaire, il faut exécuter
cette commande: composer require symfony/form

22
Création d’un Formulaire

Principe

On peut définir un formulaire soit:


1. dans le contrôleur
2. dans un autre objet qui sera appelé par le contrôleur

23
Création d’un Formulaire
Méthode 1: Création d’un formulaire dans le controlleur(½)

Pour indiquer les champs à ajouter au formulaire on utilise la méthode


add du FromBuilder

Cette méthode contient 3 paramètres :


1) le nom du champ dans le formulaire
2) le type du champ
3) un array qui contient des options spécifiques au type du champ

24
Création d’un Formulaire

Méthode 1: Création d’un formulaire dans le controlleur(2/2)

Récupération du formulaire dans le contrôleur


La récupération du formulaire au niveau des contrôleurs devient
beaucoup plus facile :

Le second paramètre « $nomClass» n’est pas obligatoire

25
Création d’un Formulaire

Problématique:
Comment alléger le contrôleur ?

Solution:
Générer une classe qui s’occupe de la construction d’un formulaire

Comment?
utilisation de la commande:
php bin/console make:form FormName

26
Création d’un Formulaire
Méthode 2: Utilisation de la commande
La commande suivante nous permet de créer un Formulaire :
php bin/console make:form FormName

Maker vous demandera si votre formulaire est associé à une entité


ou non. Répondez selon votre besoin.

Un objet dont le nom est « FormNameType » sera automatiquement


créé dans le dossier src/Form et qui contient une fonction buildForm

27
Création d’un Formulaire
L’envoi du formulaire à la page twig

➔ return $this->render('formation/.html.twig', ['form' => $form->createView()]);

Affichage du formulaire dans TWIG


⮚ Afficher la totalité du formulaire avec la méthode form
{{ form(nomDuFormulaire) }}

⮚ Afficher les composants du formulaire séparément un à un


{{ form_start(form) }}
{{ form_row(form.email) }}
{{ form_errors(form) }}
{{ form_label(form.email) }}
{{ form_widget(form.email) }}
{{ form_end(form) }}

28
Les relations entre les entités
Les types de relation possibles
Une relation (ou une association) peut être:

➢ Unidirectionnelle : Seules les instances de l’une des entités de l’association


peuvent retrouver les instances de l’entité partenaire.
⇒ Par exemple : un utilisateur peut obtenir la liste de ses adresses
connues, par contre il n’est pas possible de retrouver un utilisateur à partir
d’une adresse.
➢ Bidirectionnelle: Les instances de l’une ou de l’autre des entités de
l’association peuvent retrouver les instances de l’entité partenaire.
⇒ Par exemple : un utilisateur peut obtenir la liste des commandes qu’il a
effectué et on peut retrouver un utilisateur à partir d’une commande.
29
Les relations entre les entités
Many To One ,unidirectionnel
Exemple : un foyer universitaire héberge plusieurs étudiants

❏ @JoinColumn : indique le nom de la propriété


dans la table ainsi que le nom de la propriété
dans la table partenaire de l’association.

30
Les relations entre les entités
One To One ,unidirectionnel
Exemple : un seul étudiant possède une seule adresse

⇒ targetEntity : L’entité en relation


avec l’entité en question
⇒ mappedBy : indique la propriété
dans la classe partenaire qui est
propriétaire de l’association.

31
Les relations entre les entités
One To Many ,unidirectionnel
Exemple : un étudiant admet plusieurs num de téléphone.

❏ Pour récupérer les données d’une table. La variable


$phonenumbers est de type
Doctrine\Common\Collections\ArrayCollection

32
Les relations entre les entités
Many To Many ,unidirectionnel
Exemple : plusieurs étudiants réalisent plusieurs projets.

33
Les relations entre les entités

Remarques:
❏ Les relations, qu’on a étudiées, sont unidirectionnelles
❏ C’est à dire on peut faire $student->getProjects()
❏ Mais on ne peut pas faire $project->getStudent()

Solution:
❏ Rendre les relations bidirectionnelles

34
Les relations entre les entités
One To One ,bidirectionnel
Exemple : un étudiant possède son propre carte d’étudiant.

⇒ mappedBy fait référence à


l’attribut student dans la
classe Studentcart

⇒ inversedBy fait référence à


l’attribut cart dans la classe
Adresse 35
Les relations entre les entités
One To Many ,bidirectionnel
Exemple : Une classe contient plusieurs étudiants.

❏ targetEntity : namespace complet vers


l’entité liée.
❏ mappedBy : il s’agit de l’attribut de l’entité
cible qui illustre la relation entre les deux
entités

NB : Obligatoirement dans l’entité target il


faut avoir une définition d’attribut avec le
mot clé ManyToOne

36
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure

❏On peut générer la relation entre les deux entités


automatiquement:
Prenons l’exemple d’une relation ManyToMany
⇒ Plusieurs étudiants peuvent appartenir à plusieurs clubs.
❏ On doit tout d’abord modifier notre entité “Student” en tapant
la commande suivante:

37
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure

❏ Maintenant il faut ajouter l’attribut, dans notre cas “clubs”:

❏ Spécifier le nom de la classe avec laquelle est reliée qui “Club”:

❏ Spécifier le type de cet attribut, tapez “relation” :

38
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure

❏ Par la suite , veuillez indiquer le type de relation : ManyToMany

39
Les relations entre les entités
Many To Many ,bidirectionnelle avec table de jointure

Student.php

Club.php

40
Atelier 4

41
Références
• https://symfony.com/doc/master/bundles/DoctrineMigrationsBundle/index.htmlhttp://
php.net/manual/fr/language.oop5.magic.php
• https://symfony.com/doc/current/doctrine.html#doctrine-queries

42

Vous aimerez peut-être aussi