<< TP 3
TP 5 >>

4. L'Entité Conducteur





4.1. Entité

Nous allons mettre en place l'Entité Conducteur.

Dans le répertoire src, créez un sous-répertoire Entity, puis créer un fichier Conducteur.php.

Nous allons donc créer une entité composée des champs suivants :

Le code de la classe Conducteur est le suivant :

  1. <?php
  2. // Définition de l'espace de nom
  3. namespace App\Entity;
  4.  
  5. // Import des librairies
  6. use Doctrine\ORM\Mapping as ORM;
  7. use Doctrine\Common\Collections\ArrayCollection;
  8. use Doctrine\Common\Collections\Collection;
  9. use App\Repository\ConducteurRepository;
  10.  
  11. /**
  12.  * Définition de la classe Conducteur liée à son Repository.
  13.  * Un conducteur est défini par
  14.  * - son identifiant entier co_id
  15.  * - son nom (chaîne de 30 caractères) co_nom
  16.  */
  17. #[ORM\Entity(repositoryClass: ConducteurRepository::class)]
  18. class Conducteur
  19. {
  20.     // --------------------------------------------------------------
  21.     // Description des champs
  22.     // --------------------------------------------------------------
  23.  
  24.     #[ORM\Id]
  25.    #[ORM\GeneratedValue]
  26.    #[ORM\Column(type: 'integer')]
  27.    private ?int $co_id = null;
  28.  
  29.     #[ORM\Column(type:'string', length:30)]
  30.    private ?string $co_nom = null;
  31.    
  32.     // --------------------------------------------------------------
  33.     // Methodes
  34.     // --------------------------------------------------------------
  35.  
  36.     /**
  37.      * Constructeur
  38.      * Ici le constructeur est vide, il n'y a pas d'initialisation mais
  39.      * on pourrait initialiser les deux champs co_id, co_nom
  40.      */
  41.     public function __construct()
  42.     {
  43.        
  44.     }
  45.  
  46.     /**
  47.      * Obtenir la valeur du champ identifiant (co_id)
  48.      */
  49.     function getCoId() {
  50.  
  51.         return $this->co_id;
  52.  
  53.     }
  54.  
  55.     /**
  56.      * Obtenir la valeur du champ nom (co_nom)
  57.      */
  58.     function getCoNom() {
  59.  
  60.         return $this->co_nom;
  61.  
  62.     }
  63.  
  64.     /**
  65.      * Modifier la valeur du champ nom (co_nom)
  66.      */
  67.     function setCoNom($nom) {
  68.  
  69.         $this->co_nom = $nom;
  70.    
  71.         return $this;
  72.    
  73.     }
  74.  
  75. }
  76.  
  77. ?>

Ligne 2, on définit l'espace de nom App/Entity qui correspond au répertoire src/Entity.

Lignes 6 à 9, on introduit les différents packages Doctrine, package qui permet de réaliser l'ORM (Object Relational Mapping), afin de lier les champs de la classe (co_id et co_nom) aux champs de la base de données.

Ligne 9, on inclus le fichier ConducteurRepository.php qui permet d'interagir avec la base de données. Ce fichier doit être créé (cf. ci-après) pour pouvoir sauvegarder ou récupérer un enregistrement de la base de données.

Le reste de la classe est somme toute facile à comprendre.

4.2. EntityRepository et ManagerRegistry

Avec Symfony, EntityRepository et ManagerRegistry sont deux concepts distincts liés à la gestion des entités et à la communication avec la base de données via Doctrine, mais ils ont des rôles différents.

4.2.1. EntityRepository

L'EntityRepository est une classe spécifique à une entité qui contient la logique pour interagir avec cette entité dans la base de données. C'est un service de Doctrine conçu pour exécuter des requêtes liées à une entité particulière.

Elle permet notamment :

Toute classe X liée à une table de la base de données doit posséder son Repository.

4.2.2. ManagerRegistry

Le ManagerRegistry est un composant plus générique de Doctrine, qui sert à gérer plusieurs EntityManagers et donc des connexions à plusieurs bases de données. Il facilite ainsi l'accès aux services de Doctrine :

  • en fournissant un point d'entrée centralisé pour accéder aux différents gestionnaires de Doctrine (EntityManager, DocumentManager)
  • en permettant l'accès à un EntityManager ou un autre gestionnaire à partir d'un dépôt central. Il est souvent utilisé dans les services pour récupérer l'EntityManager. Il gère également des notions de caches et de transactions.

Par exemple, on peut écrire le code suivant afin de récupérer le Repository de la classe User :

  1. $entity_manager = $managerRegistry->getManager();
  2. $user_repository = $entity_manager->getRepository(User::class);

4.3. EntityRepository pour Conducteur

Mettons à présent en place le Repository ConducteurRepository lié à la classe Conducteur.

Dans le répertoire src, créez un sous-répertoire Repository, puis créer un fichier ConducteurRepository.php.

Cette classe comporte trois méthodes :

Le code de la classe Conducteur est le suivant :

  1. <?php
  2. namespace App\Repository;
  3.  
  4. use App\Entity\Conducteur;
  5. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  6. use Doctrine\Persistence\ManagerRegistry;
  7.  
  8. /**
  9.  * Création d'un Repository pour la classe Conducteur
  10.  */
  11. class ConducteurRepository extends ServiceEntityRepository
  12. {
  13.     /**
  14.      * Constructeur lié à la classe Conducteur
  15.      */
  16.     public function __construct(ManagerRegistry $registry)
  17.     {
  18.         parent::__construct($registry, Conducteur::class);
  19.     }
  20.  
  21.     /**
  22.      * Ajouter ou modifier un enregistrement
  23.      */
  24.     public function save(Conducteur $conducteur, bool $flush = false): void
  25.     {
  26.         $this->getEntityManager()->persist($conducteur);
  27.  
  28.         if ($flush) {
  29.             $this->getEntityManager()->flush();
  30.         }
  31.     }
  32.  
  33.     /**
  34.      * @return Conducteur[]
  35.      * Retourner un tableau d'objets Conducteur classés par ordre alphabétique
  36.      */
  37.     public function findAllOrderedByName()
  38.     {
  39.         $r = $this->createQueryBuilder('c')
  40.             ->orderBy('c.co_nom', 'ASC')
  41.             ->getQuery()
  42.             ->getResult();
  43.         return $r;
  44.     }
  45.  
  46.     // Ajoutez ici d'autres méthodes personnalisées si nécessaire
  47.     //...
  48. }
  49.  
  50. ?>
  51.  





<< TP 3
TP 5 >>