Outils pour utilisateurs

Outils du site


doctrine

La couche modèle et les données : démarrer avec Doctrine

Doctrine est un ORM php (mapping Objet/Relationnel). Les ORM consistent à réaliser la correspondance entre le modèle de données relationnel et le modèle objets de la façon la plus aisée et efficace possible. Un outil d'ORM propose un certain nombre de fonctionnalités parmi lesquelles :

  • Assurer le mapping (correspondance) des tables avec les classes, des champs avec les attributs, des relations et des cardinalités
  • Proposer une interface qui permette de facilement mettre en oeuvre des actions de type CRUD (Create/Read/Delete/Update)
  • Proposer un langage de requêtes indépendant de la base de données cible et assurer une traduction en SQL natif selon la base utilisée
  • Supporter différentes formes d'identifiants générés automatiquement par les bases de données (identity, sequence, …)
  • Fournir des fonctionnalités pour améliorer les performances (cache, lazy loading, …) .

Installation des dépendances Doctrine

Il faut d'abord installer les composants Doctrine dans notre projet.

> composer require symfony/orm-pack
> composer require symfony/maker-bundle --dev

Configuration de la connexion et création de la base de données

Cette étape consiste à indiquer au projet l'adresse de la base de données, son nom, et le login/mot de passe du compte permettant de s'y connecter. Pour cela, éditer le fichier de configuration c:\wamp64\www\webstudent\.env et décommenter et adapter la ligne ci-dessous

#DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name

Exemple :

DATABASE_URL="mysql://root:@127.0.0.1:3306/webstudent"

Cette configuration permet de se connecter à une base de données mysql nommée webstudent, située localement. Le compte de connexion est root, sans mot de passe.

La console permet ensuite de créer la base de données en exécutant la commande ci-dessous :

> php bin/console doctrine:database:create

Lors de l'exécution de la commande, l'instruction sql qui est exécutée est affichée.

Créer une entité = classe métier

Dans symfony, les classes métiers se nomment des entités. Elles peuvent être créées avec la console :

> php bin/console make:entity

Le système nous invite alors à saisir l'ensemble des propriétés de l'entité. Pour chaque propriété, nous devons préciser son type, si cette propriété sera nullable en bdd ou pas.

Dans l'exemple ci-dessous, nous créons l'entité Etudiant avec la propriété nom de type string de 50 caractères. Un fichier nommé Etudiant.php a alors été créé dans le dossier …/src/Entity. Il s'agit d'une classe métier classique avec ses propriétés. Les getters et les setters ont été générés automatiquement. Une propriété supplémentaire id de type int a été ajoutée. Elle est utilisée pour faire le mapping de la clé primaire de la table qui sera un numérique auto-incrémentéé.

Créer la table en base de données

Il est alors possible de créer la table correspondant à l'entité.

> php bin/console make:migration

Cette instruction créé à chaque fois un fichier dans le dossier src/migration avec les instructions sql à exécuter.

Pour exécuter les instructions sql, lancer la commande suivante :

> php bin/console doctrine:migrations:migrate

On voit alors l'instruction sql exécutée. Vérifiez en base l'existence de la table. A chaque propriété de l'entité correspond un champ de la table. Celle ci a pour clé primaire Id.

Persister un objet en base

Il s'agit ici de créer un objet et de rendre ses données persistantes en base de données. Pour cela, nous allons créer une nouvelle url qui exécutera une méthode du contrôleur créant un objet et insérant un enregistrement en base. Le contrôleur redirigera vers une page de consultation de l'enregistrement créé.

Ajout de la nouvelle route

Dans le fichier des routes, ajouter :

etudiantAjouter:
    path: /etudiant/ajouter
    controller: App\Controller\EtudiantController::ajouterEtudiant

Modification du contrôleur

Ajout de la méthode ajouterEtudiant dans EtudiantController

public function ajouterEtudiant(){
		
	// récupère le manager d'entités
        $entityManager = $this->getDoctrine()->getManager();

        // instanciation d'un objet Etudiant
        $etudiant = new Etudiant();
        $etudiant->setNom('Potter');
        $etudiant->setPrenom('Harry');
        //$etudiant->setDateNaiss('1980-07-31');
	$etudiant->setVille('Surrey');

        // Indique à Doctrine de persister l'objet
        $entityManager->persist($etudiant);

        // Exécue l'instruction sql permettant de persister lobjet, ici un INSERT INTO
        $entityManager->flush();

        // renvoie vers la vue de consultation de l'étudiant en passant l'objet etudiant en paramètre
       return $this->render('etudiant/consulter.html.twig', [
            'etudiant' => $etudiant,]);
		
	}

Création de la vue

Dans le dossier templates/etudiant, créer le fichier ci-dessous, nommé consulter.html.twig

<!DOCTYPE html>
<html>
    <head>
        
    </head>
    <body>       
		<h5>PAGE DE CONSULTATION D'UN ETUDIANT</h5>
 <p>
  <table >
     <tr><td>Id : </td><td>{{etudiant.id}} </td></tr>
	<tr><td>Nom : </td><td>{{etudiant.nom}}</td>
	<td  rowspan="8" class="imgEtu">
					{% set photo = 'img/etudiant/'~ etudiant.id ~'.jpg' %}
					<span class="zoom"><img src="{{ asset(photo | trans )}}" title="{{ etudiant.prenom ~ " " ~ etudiant.nom }}" alt="{{ etudiant.prenom ~ " " ~ etudiant.nom }}"/></span></td></tr> </td>
    <tr><td>Prénom : </td><td>{{etudiant.prenom}}</td></tr></tr>
	
       <tr><td>Date de naissance : </td><td>{{etudiant.dateNaiss|date("d/m/Y")}}</td></tr>
	    <tr><td>rue : </td><td>{{etudiant.numrue}} {{etudiant.rue}}</td></tr>
		 <tr><td>code postal : </td><td>{{etudiant.copos}}</td></tr>
		  <tr><td>ville : </td><td>{{etudiant.ville}}</td></tr>
	   <tr><td>Surnom : </td><td>{{etudiant.surnom}}</td></tr>
	
 </table>
	
	 
    </body>
</html>

Tests

http://localhost/webstudent/public/etudiant/ajouter

Vérifier la présence de l'enregistrement en base.

doctrine.txt · Dernière modification : 2020/07/26 16:27 de 127.0.0.1