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 :
- co_id : un identifiant de type entier qui sera auto-incrémenté au niveau
de la base de données
- co_nom : le nom de famille du conducteur sous forme d'une chaîne de maximum
30 caractères
Le code de la classe Conducteur est le suivant :
<?php
// Définition de l'espace de nom
namespace App\Entity;
// Import des librairies
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use App\Repository\ConducteurRepository;
/**
* Définition de la classe Conducteur liée à son Repository.
* Un conducteur est défini par
* - son identifiant entier co_id
* - son nom (chaîne de 30 caractères) co_nom
*/
#[ORM\Entity(repositoryClass: ConducteurRepository::class)]
class Conducteur
{
// --------------------------------------------------------------
// Description des champs
// --------------------------------------------------------------
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $co_id = null;
#[ORM\Column(type:'string', length:30)]
private ?string $co_nom = null;
// --------------------------------------------------------------
// Methodes
// --------------------------------------------------------------
/**
* Constructeur
* Ici le constructeur est vide, il n'y a pas d'initialisation mais
* on pourrait initialiser les deux champs co_id, co_nom
*/
public function __construct()
{
}
/**
* Obtenir la valeur du champ identifiant (co_id)
*/
function getCoId() {
return $this->co_id;
}
/**
* Obtenir la valeur du champ nom (co_nom)
*/
function getCoNom() {
return $this->co_nom;
}
/**
* Modifier la valeur du champ nom (co_nom)
*/
function setCoNom($nom) {
$this->co_nom = $nom;
return $this;
}
}
?>
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 :
- de créer des requêtes personnalisées ou d'utiliser des méthodes prédéfinies comme find(), findAll(),
findBy(), etc., pour récupérer les données relatives à l'entité
- d'isoler la logique d'accès aux données spécifique à une entité, facilitant la réutilisation du code et la maintenabilité
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 :
$entity_manager = $managerRegistry->getManager();
$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 :
- __construct() : qui permet de lier la classe Conducteur à un ManagerRegistry
- save() : qui autorise la sauvegarde d'un object de type Conducteur dans la base de données
- findAllOrderedByName : qui facilite la récupération des conducteurs depuis la base de données en retournant
une liste (tableau) qui contient les noms des conducteurs classés par ordre alphabétique
Le code de la classe Conducteur est le suivant :
<?php
namespace App\Repository;
use App\Entity\Conducteur;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* Création d'un Repository pour la classe Conducteur
*/
class ConducteurRepository extends ServiceEntityRepository
{
/**
* Constructeur lié à la classe Conducteur
*/
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Conducteur::class);
}
/**
* Ajouter ou modifier un enregistrement
*/
public function save(Conducteur $conducteur, bool $flush = false): void
{
$this->getEntityManager()->persist($conducteur);
if ($flush) {
$this->getEntityManager()->flush();
}
}
/**
* @return Conducteur[]
* Retourner un tableau d'objets Conducteur classés par ordre alphabétique
*/
public function findAllOrderedByName()
{
$r = $this->createQueryBuilder('c')
->orderBy('c.co_nom', 'ASC')
->getQuery()
->getResult();
return $r;
}
// Ajoutez ici d'autres méthodes personnalisées si nécessaire
//...
}
?>