04/03/2023

2. Lieux

Lu 364 fois Licence Creative Commons

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>
{# ... #}