web-dev-qa-db-fra.com

Doctrine Listener versus Subscriber

Je travaille dans le cadre Symfony2 et je me demande quand utiliser un abonné à Doctrine plutôt qu’un auditeur. Doctrine's documentation pour les auditeurs est très clair, mais les abonnés sont plutôt passés sous silence. L'entrée du livre de recettes de Symfony est similaire.

69
nurikabe

De mon point de vue, il n'y a qu'une seule différence majeure:

  • L'écouteur est inscrit en spécifiant les événements sur lesquels il écoute.
  • L'abonné dispose d'une méthode indiquant au répartiteur les événements qu'il écoute

Cela peut ne pas sembler être une grande différence, mais si vous y réfléchissez, il y a des cas où vous souhaitez utiliser l'un sur l'autre:

  • Vous pouvez affecter un auditeur à plusieurs distributeurs avec différents événements, tels qu'ils sont définis au moment de l'enregistrement. Vous devez seulement vous assurer que chaque méthode est en place dans l'auditeur.
  • Vous pouvez modifier les événements pour lesquels un abonné est enregistré au moment de l'exécution et même après son inscription en modifiant la valeur de retour de getSubscribedEvents (pensez à un moment où vous écoutez un événement très bruyant et que vous voulez exécuter quelque chose une fois)

Il y a peut-être d'autres différences dont je ne suis pas au courant!

82
Sgoettschkes

Je ne sais pas si c'est fait accidentellement ou intentionnellement. Mais les abonnés ont une priorité plus élevée que les auditeurs - https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass /RegisterEventListenersAndSubscribersPass.php#L73-L98

Du point de vue de la doctrine, peu importe sa nature (auditeur ou abonné), les deux sont finalement enregistrés comme écouteurs - https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager .php # L137-L140

C'est ce que j'ai repéré.

8
Ruslan Polutsygan

Vous devez utiliser event abonné lorsque vous souhaitez gérer plusieurs événements dans une classe, par exemple dans cet article de page de symfony2 doc , vous remarquerez peut-être que l'écouteur d'événement ne peut gérer qu'un seul événement, mais disons que vous souhaitez gérer plusieurs événements pour une entité, prePersist, preUpdate, postPersist etc ... si vous utilisez l'écouteur d'événements, vous devez coder plusieurs écouteurs d'événements, un pour chaque événement, mais si vous utilisez abonné à un événement, il vous suffit de coder une classe le souscripteur d'événement, regardez qu'avec l'abonné d'événement, vous pouvez gérer plus d'un événement dans une classe, c'est bien la façon dont je l'utilise, je préfère le code axé sur ce dont le modèle a besoin, un exemple de ce que vous voulez peut être pour gérer plusieurs événements de cycle de vie globalement uniquement pour un groupe de vos entités, vous pouvez coder une classe parent et définir ses méthodes globales, puis faire en sorte que vos entités héritent de cette classe et que plus tard, dans votre événement, abonnez-vous à chaque événement souhaité , prePersist, preUpd ate, postPersist etc ... puis demandez cette classe parent et exécutez ces méthodes globales. 

7
metalvarez

Une autre chose importante: Doctrine EventSubscribers ne vous permet pas de définir une priorité.

En savoir plus sur ce sujet ici

3
Wilt

Les deux vous permettent d'exécuter quelque chose sur un événement particulier avant/après, etc.

Cependant, les écouteurs vous permettent uniquement d'exécuter des comportements encapsulés dans votre entité. Ainsi, un exemple pourrait être la mise à jour d'un horodatage "date_edited".

Si vous devez sortir du contexte de votre entité, vous aurez besoin d'un abonné. Un bon exemple pourrait être d'appeler une API externe ou si vous devez utiliser/inspecter des données qui ne sont pas directement liées à votre entité.

3
Lee Davis

Voici ce que dit le doc à ce sujet en 4.1. Comme c'est globalement appliqué aux événements, je suppose que c'est aussi valable pour Doctrine (pas sûr à 100%).

Auditeurs ou abonnés

Les auditeurs et les abonnés peuvent être utilisés indifféremment dans la même application. La décision d'utiliser l'un ou l'autre est généralement une affaire de goût personnel. Cependant, il y a quelques avantages mineurs pour chaque d'eux:

  • Les abonnés sont plus faciles à réutiliser car la connaissance des événements est conservée dans la classe plutôt que dans la définition du service . C'est la raison pour laquelle Symfony utilise les abonnés en interne;
  • Les écouteurs sont plus flexibles car les ensembles peuvent activer ou désactiver chacun d'eux conditionnellement, en fonction de certaines valeurs de configuration.

http://symfony.com/doc/master/event_dispatcher.html#listeners-or-subscribers

2
Kaizoku Gambare

De la documentation: 

Le moyen le plus courant d'écouter un événement est d'enregistrer un événement auditeur avec le répartiteur. Cet auditeur peut écouter un ou plusieurs événements et est averti chaque fois que ces événements sont envoyés.

Un autre moyen d'écouter des événements consiste à utiliser un abonné à un événement. Un évènement subscriber est une classe PHP capable de dire au répartiteur exactement les événements auxquels il devrait s'abonner. Il implémente le Interface EventSubscriberInterface, qui nécessite un seul fichier statique statique méthode appelée getSubscribeEvents ().

Voir l'exemple ici: 

https://symfony.com/doc/3.3/components/event_dispatcher.html

0