Création des entités
N’hésitez pas à créer vos entités à l’aide du wizard de Symfony, en faisant :
Créez une autre classe dans le dossier src/Entity appelée AsbtractEntity.php (voir le modèle).
Cette classe renfermera l’ensemble des champs qui seront partagés par toutes les entités de votre application.
De manière générale, ils sont au nombre de 4 :
idqui sert d’index en interne pour des requêtes SQL rapidesuuidqui sert de référence publique pour ne pas divulguer l’id aux visiteurs via l’URLcreatedAtqui stocke la date de créationupdatedAtqui stocke la dernière date de modification
Vous pourriez également avoir deux champs supplémentaires,
createdByetupdatedBy, qui permettraient de stocker les utilisateurs ayant fait la création et la dernière modification de cette entité, et qui seraient des relations en ManyToOne vers l’entitéUser.
Partager les propriétés en commun dans une entité abstraite
Comme expliqué juste au-dessus, nous avons généralement au moins 4 champs communs à toutes les entités. Il paraît alors logique de créer une entité abstraite qui renfermera ces champs, et que toutes les entités pourront hériter.
Pour cela, créez une nouvelle classe src/Entity/AbstractEntity.php avec le contenu suivant :
Voici quelques explications sur ce fichier.
Les types de colonne
Par défaut, lorsque vous passez par le maker pour créer vos entités, les types de colonne seront normalement marqués en dur.
Il existe pourtant un type fourni par Doctrine qui référence l’ensemble des types disponibles : Doctrine\DBAL\Types\Types.
Pensez à utiliser le type, car si le nom en dur change dans une nouvelle version de Doctrine, le type restera lui le même.
DatetimeInterface & DateTimeImmutable
Lorsque vous travaillez avec des dates dans vos applications, différenciez bien DateTimeInterface et DateTimeImmutable :
- une propriété de type
DateTimeImmutablen’a pas vocation à changer dans le temps (ex:createdAt) - une propriété de type
DateTimeInterfacepeut éventuellement changer dans le temps : (ex:updatedAt)
Le constructeur
Certaines propriétés de nos entités peuvent être attribuées automatiquement à leur création.
C’est par exemple le cas de l’uuid ou de la date de création.
Pour cela, nous pouvons les spécifier dans le __construct de l’entité :
Les événements Doctrine
Il est également possible de déclencher des fonctions lorsque certains événements se passent au sein d’une entité :
- Avant de persister :
Doctrine\ORM\Mapping\PrePersist - Avant une mise à jour :
Doctrine\ORM\Mapping\PreUpdate - La liste complète sur la documentation de Doctrine
Pour que ces événements soient déclenchés au sein de notre entité, nous devons lui ajouter un attribut spécial :
Dans notre cas, nous souhaitons mettre à jour la date de modification à chaque mise à jour de l’entité, donc nous allons utiliser l’événement preUpdate :
Les getters & setters
Les getters et setters sont le moyen d’accéder à une propriété ou la modifier en dehors de la classe, dans le cas où cette dernière est private ou protected.
Doctrine les utilise abondamment pour hydrater les retours de requête SQL par exemple.
Mais il faut les utiliser avec précaution, car certaines propriétés ne doivent pas avoir de setters puisqu’elles sont définies automatiquement.
C’est le cas ici de nos propriétés présentes dans AbstractEntity, nous leur attribuons alors seulement un getter.