Nous souhaitons maintenant ajouter des lieux pour indiquer où se déroulent les événements.
Entité et relation
En utilisant la commande make:entity
, créer une entité Venue
avec les propriétés suivantes:
Description | Nom | Type | Taille | Nullable |
---|---|---|---|---|
Nom du lieu | name |
string |
255 | ❌ |
Adresse du lieu | address |
string |
255 | ❌ |
Chaque événement doit se dérouler dans un lieu, il faut alors créer une relation entre les 2 entités, qui se traduira pour une contrainte de clé étrangère en base de données.
Sans quitter la commande, ajouter une propriété events
à l'entité Venue
, de type relation
, liée à la classe Event
:
[output] Add another property? Enter the property name (or press <return> to stop adding fields):
> events
[output]
[output] Field type (enter ? to see all types) [string]:
> relation
[output]
[output] What class should this entity be related to?:
> Event
Il nous est alors présenté une liste des relations possibles. Sélectionner OneToMany
afin qu'un lieu puisse avoir plusieurs événements et qu'un événement ne soit associé qu'à 1 lieu:
[output] What type of relationship is this?
[output] ------------ -------------------------------------------------------------------
[output] Type Description
[output] ------------ -------------------------------------------------------------------
[output] ManyToOne Each Venue relates to (has) one Event.
[output] Each Event can relate to (can have) many Venue objects.
[output]
[output] OneToMany Each Venue can relate to (can have) many Event objects.
[output] Each Event relates to (has) one Venue.
[output]
[output] ManyToMany Each Venue can relate to (can have) many Event objects.
[output] Each Event can also relate to (can also have) many Venue objects.
[output]
[output] OneToOne Each Venue relates to (has) exactly one Event.
[output] Each Event also relates to (has) exactly one Venue.
[output] ------------ -------------------------------------------------------------------
[output]
[output] Relation type? [ManyToOne, OneToMany, ManyToMany, OneToOne]:
> OneToMany
Afin que l'on puisse accéder à l'objet Venue
depuis une entité Event
, une propriété sera également ajoutée dans Event
. On peut choisir le nom de cette propriété, qui est suggérée par défaut à venue
(visible entre crochets). Laisser vide pour sélectionner la valeur par défaut:
[output] A new property will also be added to the Event class so that you can access and set the related Venue object from it.
[output]
[output] New field name inside Event [venue]:
>
Dans le cas où un événement pourrait ne pas avoir de lieu, on doit indiquer la nullabilité de la propriété. On autorisera les événements à ne pas avoir de lieu:
[output] Is the Event.venue property allowed to be null (nullable)? (yes/no) [yes]:
>
Enfin, il nous est proposé l'activation de l'orphanRemoval
pour automatiquement supprimer les événements qui seraient dissociés d'un lieu. Comme il est indiqué dans la "note", c'est à éviter si un événement peut changer de lieu. On laissera désactivé:
[output] Do you want to activate orphanRemoval on your relationship?
[output] A Event is "orphaned" when it is removed from its related Venue.
[output] e.g. $venue->removeEvent($event)
[output]
[output] NOTE: If a Event may *change* from one Venue to another, answer "no".
[output]
[output] Do you want to automatically delete orphaned App\Entity\Event objects (orphanRemoval)? (yes/no) [no]:
>
Migration et Fixtures
Comme après chaque modification de nos entités, il est nécessaire de mettre à jour la base de données en utilisant une migration:
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Une fois la structure de la base mise à jour, on peut s'occuper des fixtures. Créer un fichier /fixtures/venue.yaml:
App\Entity\Venue:
venue_{1..10}:
name: '25%? <ucfirst(<safeColorName()>)> <ucfirst(<word()>)>: <ucfirst(<word()>)>'
address: '<address()>'
Les lieux seront identifiés de venue_1
à venue_10
, que l'on va pouvoir référencer automatiquement et de manière aléatoire dans /fixtures/event.yaml avec la syntaxe @reference
:
App\Entity\Event:
event_{1..50}:
# ...
venue: '90%? @venue_*'
On recharge complètement les données:
php bin/console hautelook:fixtures:load
Template
Pour terminer, modifier le template /templates/_includes/event_card.html.twig pour y ajouter les informations sur le lieu. Si aucun lieu n'est précisé, on affichera "Lieu secret":
{# ... #}
<p class="is-size-6">
{% if event.venue is null %}
<i class="fa-regular fa-circle-question"></i> Lieu secret<br>
{% else %}
<i class="fa-solid fa-location-dot"></i> <a href="#">{{ event.venue.name }}</a><br>
{% endif %}
<i class="fa-regular fa-calendar"></i> {{ event.startAt|date('d/m/Y') }}<br>
<i class="fa-solid fa-clock"></i> {{ event.startAt|date('H\\hi') }} - {{ event.endAt|date('H\\hi') }}
</p>
{# ... #}