Académique Documents
Professionnel Documents
Culture Documents
@alioukahere 550
16 oct. 2021
Hey salut, bienvenue dans cette série de tutoriel sur Symfony. Dans les
précédentes partie nous somme allés jusqu'à créer les relations entre nos
entités. Dans cette partie nous allons voir comment utiliser le gestionnaire
d'entité de Symfony pour ajouter, modifier ou supprimer des objets en base de
données et nous allons aussi utiliser les repositories pour pouvoir lire nos
enregistrements. Alors t'es prêt? On commence tout de suite.
Mais avant, il faut cloner le dépôt du projet pour pouvoir pratiquer avec moi:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 1/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
# EntityManager
Le gestionnaire d'entités ( EntityManager ) est un objet Doctrine qui va nous
permettre de Gérer nos entités, nous allons l'utiliser pour ajouter, modifier ou
supprimer des objets en base de données. Pour récupérer l'EntityManager
dans un contrôleur:
<?php
<? h
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 2/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
<?php
// src/Controller/EventController.php
namespace App\Controller;
use App\Entity\Event;
use App\Entity\Tag;
use DateInterval;
use DateTime;
use DateTimeImmutable;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
// ...
}
On crée deux objets $event et $event2 que nous allons ajouter en base de
données par la suite, l'objet $event est disponible publiquement et l'objet
$event2 pas encore. La partie création des objets est plutôt basique. Laisse
moi t'expliquer un peu comment nous utilisons l'EntityManager:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 5/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Avant d'aller tester l'enregistrement de nos objets, nous allons juste un peu
modifier l'entité Event pour mentionner les valeurs par défaut createdAt et
isPublished :
<?php
// src/Entity/Event.php
namespace App\Entity;
use App\Repository\EventRepository;
use DateTime;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EventRepository::class)
*/
class Event
{
// ...
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 6/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
/**
+ * @ORM\Column(type="boolean", options={"default": false})
*/
private $isPublished;
// ...
// ...
}
J'en ai aussi profité pour définir le champ isPublished comme false par
défaut en base de données. Il faut donc exécuter les migrations pour le
prendre en compte:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 7/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Oouuppsss! On a une erreur. L'erreur dit qu'il y a des entités qui n'ont pas été
persisté. Nous avons juste persister les objets $event et $event2 , mais
l'objet $event contient deux autres objets $codeTag et $webTag dont nous
n'avons pas persister, le gestionnaire d'entités ne sait donc pas quoi faire de
ces objets, il ne peut pas les enregistrer parce qu'on ne lui a pas dit de le faire,
mais il a besoin des identifiants de ces objets pour faire la relation. Nous
pouvons soit persister les deux objets $codeTag et $webTag et nous ferons
la même chose à chaque fois, même si l'événement à 10 tags, ou nous
pouvons demander à Doctrine de gérer cela automatiquement, il devra
persister les objets et les ajouter en base de données s'ils n'existent pas. Pour
cela, nous allons modifier l'entité Event au niveau de la relation entre Event
et Tag :
<?php
// src/Controller/Event/php
namespace App\Entity;
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 8/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
use App\Repository\EventRepository;
use DateTime;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=EventRepository::class)
*/
class Event
{
// ...
/**
+ * @ORM\ManyToMany(
+ * targetEntity=Tag::class,
+ * inversedBy="events",
+ * cascade={"persist"}
+ * )
*/
private $tags;
// ...
}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 9/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Et là biimmmm!!!
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 10/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
<?php
namespace App\Repository;
use App\Entity\Event;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method Event|null find($id, $lockMode = null, $lockVersion = null)
* @method Event|null findOneBy(array $criteria, array $orderBy = null)
* @method Event[] findAll()
* @method Event[] findBy(array $criteria, array $orderBy = null, $l
*/
class EventRepository extends ServiceEntityRepository
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 11/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Event::class);
}
// /**
// * @return Event[] Returns an array of Event objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('e')
->andWhere('e.exampleField = :val')
->setParameter('val', $value)
->orderBy('e.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?Event
{
return $this->createQueryBuilder('e')
->andWhere('e.exampleField = :val')
->setParameter('val', $value)
>getQuery()
>g tQ ()
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 12/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
->getQuery()
->getOneOrNullResult()
;
}
*/
}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 13/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
modèle qui est la liste des événements à afficher sur la page d'accueil. Voici le
contrôleur homepage() modifier:
<?php
// src/Controller/CoreController.php
namespace App\Controller;
use App\Repository\EventRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
{
/**
* @Route("/", name="homepage")
*/
public function homepage(EventRepository $eventRepository): Respons
{
$events = $eventRepository->findAll();
// ...
}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 14/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
/**
* @Route("/", name="homepage")
*/
public function homepage(): Response
{
$eventRepository = $this->getDoctrine()->getRepository(Event::class
$events = $eventRepository->findAll();
Maintenant la vue:
{# templates/core/index.html.twig #}
{% extends 'base.html.twig' %}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 15/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
{% block content %}
<div class="container mt-4">
<div class="row">
<div class="col">
<h2 class="text-center">Événements à venir</h2>
</div>
</div>
<div class="row">
<div class="d-flex flex-row flex-wrap">
{% for event in events %}
<div class="card m-2" style="width: 16rem;">
<img class="card-img-top" src="{{ event.picture
<div class="card-body">
<h5 class="card-title">{{ event.title }}</h
<p class="card-text text-muted">
Le
{{ event.eventDate|date('d/m/Y') }}
<br>
{{ event.address }}
</p>
<a href="{{ path('show_event', {'id': event
</div>
</div>
{% endfor %}
/ i
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 16/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
</div>
</div>
</div>
{% endblock %}
Tout ce qui change c'est de la ligne 19 à 33, nous utilisons la boucle for de
Twig pour parcourir le tableau events qui a été envoyé par le contrôleur puis
à chaque tour, nous avons l'objet courant dans un objet event (sans le s ) et
nous l'affichons. Pour afficher un attribut nous utilisons le point: {{ event.id }}, {{
event.picture }}, et pour afficher la date, il faut la formatter, nous avons utiliser
le filtre date ici, nous allons le modifier dans un instant. Pour l'instant, allons
voir ce que nous avons sur la page d'accueil https://localhost:8000:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 17/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Bon je pense que le client il a vraiment été clair maintenant, qu'est-ce qu'on
fait donc? On crée notre propre méthode? Pas maintenant, nous allons utiliser
une autre méthode fournit par Symfony, on va donc modifier la fonction
homepage() comme ceci:
/**
* @Route("/", name="homepage")
*/
public function homepage(EventRepository $eventRepository): Response
{
$events = $eventRepository->findBy(
['isPublished' => true],
['eventDate' => 'ASC'],
12,
0
);
Bon on ne sait pas si ça a vraiment marcher ou pas, vu que nous avons juste un
événement. Pour pallier à cela, nous allons ajouter au moins quatres
événements publiques. On peut soit lancer MySQL et ajouter nous même ces
données ou utiliser des fixtures.
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 19/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Les fixtures sont des données de tests que nous ajoutons à notre base de
données. Pour pouvoir les définir, il nous faut installer un nouveau composant
orm-fixtures , avec composer cela va donner:
<?php
namespace App\DataFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
$manager->flush();
}
}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 20/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Nous allons définir les objets que nous voulons ajouter dans la base de
données au niveau de la fonction load() , et la dernière ligne de la fonction
$manager->flush() va enregistrer tous les objets que nous aurons persister.
<?php
namespace App\DataFixtures;
use App\Entity\Event;
use App\Entity\Tag;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;
$ 1 E ()
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 21/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
$event1 = new Event();
$event1->setPicture('https://images.pexels.com/photos/251225/pe
$event1->setTitle('À la découverte du développement web');
$event1->setAddress('Sacré Coeur 3 VDN, Dakar');
$event1->setDescription('Lorem ipsum dolor sit amet consectetur
adipisicing, elit. Libero tenetur beatae repellendus possim
quae! Impedit soluta sit iusto amet unde repudiandae fugit
perspiciatis, deleniti quod placeat.');
// la date de l'événement c'est dans 14 jours à 10h30
$event1->setEventDate((new \DateTime('+14 days'))->setTime(10,
$event1->setIsPublished(true);
$event1->setPublishedAt(new \DateTimeImmutable());
$event1->addTag($webTag);
$event1->addTag($codeTag);
$manager->persist($event1);
$event3->setPublishedAt(new \DateTimeImmutable());
$event3->addTag($designTag);
$manager->persist($event3);
$manager->flush();
}
}
Nous ajoutons cinq événements dont quatres sont publics, avec différentes
dates et tags.
Nous allons maintenant exécuter les fixtures pour que ces données soient
ajouter dans la base de données, pour cela il faut exécuter la commande:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 24/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Bon j'avoue que les boutons en escalier ça fait un peu mal aux yeux, mais on
est pas là pour nous battre avec du CSS et quelques pixels et peut être que
l'événement sur l'UI Design va nous aider avec cela.
Revenons plutôt sur la façon d'afficher la date, pour l'instant nous avons un
affichage basique, mais le client veut que la date s'affiche comme ceci: Le 13
sept. 2021 à 10:30 par exemple. Et en tant que développeur, on fait ce que le
client il veut. Twig dispose d'un filtre format_datetime que nous allons utiliser
pour cela, pour l'utiliser, il faut d'abord installer le composant twig/intl-
extra :
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 25/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
{# templates/core/index.html.twig #}
{% extends 'base.html.twig' %}
{% block content %}
<div class="container mt-4">
<div class="row">
<div class="col">
<h2 class="text-center">Événements à venir</h2>
</div>
</div>
<div class="row">
<div class="d-flex flex-row flex-wrap">
{% for event in events %}
<div class="card m-2" style="width: 16rem;">
<img class="card-img-top" src="{{ event.picture
<div class="card-body">
<h5 class="card-title">{{ event.title }}</h
<p class="card-text text-muted">
Le
{{ event.eventDate|format_datetime() }}
<br>
{{
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 }} 26/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
{{ event.address }}
</p>
<a href="{{ path('show_event', {'id': event
</div>
</div>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 27/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
OK, nous avons la date en anglais et même si on aimerait dans le futur avoir
un public anglais, pour l'instant le client cible un public français. Sur la
documentation, il est dit que nous pouvons définir le local comme ceci:
{{ event.eventDate|format_datetime(locale='fr') }}
Et voilà!!!
Ceci n'est pas la meilleur manière pour traduire les dates, le mieux c'est d'avoir
le formatage en fonction de la langue de notre application et nous reviendrons
sur cela dans un tutoriel spécifique sur l'internationalisation ( i18n ).
Pour l'instant nous avons à peu près ce que nous voulons, il reste à gérer
l'heure, nous ne voulons pas afficher les seconds:
/**
* @Route("/events/{id}", name="show_event", requirements={"id"="\d+"})
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 29/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
*/
public function show($id): Response
{
return $this->render('event/show.html.twig', ['event_id' => $id]);
}
/**
* @Route("/events/{id}", name="show_event", requirements={"id"="\d+"})
*/
public function show($id, EventRepository $eventRepository): Response
{
$event = $eventRepository->find($id);
{# templates/event/show.html.twig #}
{% extends 'base.html.twig' %}
{% block title %}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 30/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
{% block title %}
{{ event.title }}
|
{{ parent() }}
{% endblock %}
{% block content %}
<div class="hero p-4">
<div class="container">
<div class="row">
<div class="col-sm-12 col-lg-6">
<img src="{{ event.picture }}" alt="" class="img-fl
</div>
<div class="col-sm-12 col-lg-6 mt-3">
<h2>{{ event.title }}</h2>
<p class="card-text text-muted">
Le
{{ event.eventDate|format_datetime('medium', 's
<br>
{{ event.address }}
</p>
<p class="lead">
{{ event.description }}
</p>
<a href="#" class="btn btn-primary">Réserver</a>
</div>
</div>
</div>
</div>
{% endblock %}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 31/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Mais nous avons un problème que nous n'avons pas gérer, pour l'instant nous
partons du principe que l'utilisateur va juste cliquer sur un événement pour
l'afficher, qu'est-ce qu'il se passe s'il décide de saisir lui même l'URL et qu'il
saisisse un id qui n'existe pas? Disons https://localhost:8000/events/10000
par exemple pour l'événement qui a l'id 10000, eh bien essaie pour voir:
On a une erreur qui dit qu'il est impossible d'accéder à l'attribut title d'une
variable qui est null . Il faut savoir que la méthode find() retourne null
si l'objet n'existe pas et dans notre cas nous prenons cet objet qui est null
puis nous l'envoyons à la vue, ce qui cause cette erreur.
Pour éviter cela, nous allons vérifier que l'objet $event que nous récupérons
de la base de données n'est pas null , si l'objet est nul, on retourne une
erreur 404 pour dire que l'objet n'existe pas, sinon on retourne la page de
détail de l'événement:
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 32/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
/**
* @Route("/events/{id}", name="show_event", requirements={"id"="\d+"})
*/
public function show($id, EventRepository $eventRepository): Response
{
$event = $eventRepository->find($id);
if (!$event) {
throw $this->createNotFoundException(
"L'événement avec l'id = {$id} n'existe pas!"
);
}
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 33/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Bon c'est vrai que cette page ressemble beaucoup à celle que nous avions
avant, mais si tu regardes bien, le statut de la réponse est 404 cette fois-ci et
c'est ce qui compte vraiment pour ce genre d'erreur. Puis quand nous serons
en production tu ne verras plus cette page, mais la page d'erreur que tu auras
créer toi même.
Mais je trouve la fonction un peu verbeuse, laisse moi te présenter une autre
manière de récupérer automatiquement l'événement ou de lever une exception
NotFoundException si l'objet n'existe pas.
# La magie du ParamConverter
Le ParamConverter va nous permettre de rendre la fonction show() moins
verbeuse. Le ParamConverter va se charger d'aller chercher l'objet en base de
données et si l'objet existe, continuer l'exécution du contrôleur, sinon retourner
une erreur 404 et arrêter l'exécution. Et son utilisation est tellement simple:
/**
* @R t ("/ t /{id}" " h t"
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118
i t {"id" "\d "}) 34/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
* @Route("/events/{id}", name="show_event", requirements={"id"="\d+"})
*/
public function show(Event $event): Response
{
return $this->render('event/show.html.twig', ['event' => $event]);
}
# Modifier un objet
Maintenant que nous avons quelques objets en base de données, nous allons
voir comment les modifier.
<?php // src/Controller/EventController.php
namespace App\Controller;
// ...
/**
* @Route("/events/{id}/update", name="update_event")
*/
public function update(
Event $event,
EntityManagerInterface $entityManager
): Response {
$entityManager->flush();
l'existence de cet objet, il est lui même aller le chercher en base de données.
Nous appelons directement la méthode flush() pour porter les
modifications en base de données.
# Supprimer un objet
Pour supprimer un objet, il faut aussi utiliser le gestionnaire d'entités avec sa
méthode remove() :
<?php // src/Controller/EventController.php
namespace App\Controller;
// ...
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 37/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
/**
* @Route("/events/{id}/delete", name="delete_event")
*/
public function delete(
Event $event,
EntityManagerInterface $entityManager
): Response {
// grâce au ParamConverter, nous avons automatiquement accès à
$entityManager->remove($event); // on utilise la method remove
$entityManager->flush();
Et voilà, c'est aussi simple que cela. Pour supprimer l'événement avec l'id égal
à 5, il faut aller à l'adresse https://localhost:8000/events/5/delete.
Voilà, nous avons vu comment créer, lire, modifier et supprimer des objets avec
Doctrine. Dans la prochaine section nous allons passer à un niveau un peu
plus supérieur, nous allons parler des formulaire et commencer à créer les
formulaires pour créer des événements. D'ici là, continue de pratiquer ce que
nous avons appris jusque là, si tu as des questions, n'hésite pas à laisser un
commentaire ci-dessous ou à te rendre sur discord pour en discuter. À plus
tard, prends soin de toi!
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 38/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Partage ce tutoriel
Merci à
Continue de lire
@alioukahere
2 oct. 2021
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 39/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
@alioukahere
25 sept. 2021
@alioukahere
1 sept. 2021
Discussion
Tu dois être connecté pour participer à la discussion.
Me connecter.
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 40/41
14/12/2021 21:06 Créer une application web avec Symfony - Doctrine
Kaherecode
Apprends à programmer avec des tutoriels pratiques écrit pas des développeurs.
https://www.kaherecode.com/tutorial/creer-une-application-web-avec-symfony-doctrine-61586b876c118 41/41