Voici mes remarques pour la partie IV/ 5) « Le gestionnaire d’évènements de Symfony » :
1) Il faut remplacer les « $this->get(’event_dispatcher’) » par « $this->eventDispatcher » :
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class BlogController extends AbstractController
{
private EventDispatcherInterface $eventDispatcher;
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
...
$dispacher = $this->eventDispatcher;
$dispatcher->addListener('kernel.response', array($betaListener, 'onKernelResponse'));
2) Il faut remplacer :
-> « FilterResponseEvent » par « ResponseEvent »
-> « GetResponseEvent » par « RequestEvent »
-> « GetResponseForControllerResultEvent » par « ViewEvent »
Nouveau dans Symfony 4.3
Mise à jour des classes d'événements de HttpKernel
En plus du changement précédent, nous avons également mis à jour les classes des événements que Symfony passe pour ses propres événements.
Les nouveaux noms sont beaucoup plus intuitifs et concis :
FilterControllerArgumentsEvent devient ControllerArgumentsEvent
FilterControllerEvent devient ControllerEvent
FilterResponseEvent devient ResponseEvent
GetResponseForControllerResultEvent devient ViewEvent.
GetResponseForExceptionEvent devient ExceptionEvent.
PostResponseEvent devient TerminateEvent
3) Il faut remplacer les « ::MASTER_REQUEST » par « MAIN_REQUEST »
(déprécié depuis symfony/http-kernel 5.3, utilisez MAIN_REQUEST à la place)
4) Il faut remplacer
« use Symfony\Component\EventDispatcher\Event; »
par :
« use Symfony\Contracts\EventDispatcher\Event; »
5) Voici ma version de la méthode ajouterAction() :
class BlogController extends AbstractController
{
private EventDispatcherInterface $eventDispatcher;
public function __construct(EventDispatcherInterface $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
}
...
public function ajouter(Request $request)
{
$article = new Article;
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$event = new MessagePostEvent($article->getContenu(), $this->getUser());
$dispacher = $this->eventDispatcher;
$dispacher->dispatch($event ,BigbrotherEvents::onMessagePost);
$article->setContenu($event->getMessage());
$em = $this->getDoctrine()->getManager();
$em->persist($article);
$em->flush();
$this->get('session')->getFlashBag()->add('info', 'Article bien ajouté');
return $this->redirectToRoute('blog_accueil');
}
return $this->render('blog/ajouter.html.twig', array(
'form' => $form->createView(),
));
}
6) Voici ma version de la class CensureListener :
<?php
namespace App\Bigbrother;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Security\Core\User\UserInterface;
class CensureListener
{
protected $liste;
protected $mailer;
public function __construct(array $liste, MailerInterface $mailer)
{
$this->liste = $liste;
$this->mailer = $mailer;
}
protected function sendEmail($message, UserInterface $user)
{
$message = (new Email())
->subject("Nouveau message d'un utilisateur surveillé")
->from('admin@votresite.com')
->to('monmail@bidule.com')
->text("L'utilisateur surveillé '" . $user->getUserIdentifier() . "' a posté le message suivant : '" . $message . "'");
$this->mailer->send($message);
}
protected function censureMessage($message)
{
$message = str_replace(array('top secret', 'mot interdit'), '', $message);
return $message;
}
public function onMessagePost(MessagePostEvent $event)
{
if (in_array($event->getUser()->getId(), $this->liste)) {
$this->sendEmail($event->getMessage(), $event->getUser());
$message = $this->censureMessage($event->getMessage());
$event->setMessage($message);
}
}
}
Dans cette classe, il faut remplacer :
->setBody("L’utilisateur surveillé '".$user->getUsername()."' a posté le message suivant :
par :
->setBody("L’utilisateur surveillé '".$user-> getUserIdentifier ()."' a posté le message suivant :
Source :
Une autre source de confusion liée aux utilisateurs est le concept de "nom d'utilisateur" qui est utilisé dans la sécurité de Symfony. Dans de nombreuses applications, ce nom d'utilisateur n'est pas un nom d'utilisateur traditionnel, mais un email ou même un jeton d'API.
C'est pourquoi dans Symfony 5.3 nous avons décidé d'éviter cette confusion et nous avons renommé "username" en "user identifier". Cela peut nécessiter quelques changements dans le code de votre application (dans 5.3 les anciens noms fonctionnent toujours mais ils sont dépréciés et dans Symfony 6.0 ils seront supprimés).
7) Après la phrase « Et bien sûr, la définition du service qui convient » j’ai :
blog.censure_listener:
class: App\Bigbrother\CensureListener
arguments:
$liste: [1, 2]
tags:
- { name: kernel.event_listener, event: blog.bigbrother.post_message, method: onMessagePost }
Voilà, j’espère que ça aidera.