2016-03-27 11 views
-1

Edit: Um Verwirrung zu vermeiden, ist diese Frage zu Entity Listener und nicht überEvent ListenerSymfony/Lehre EventSubscriber vs EntityListener

I Symfony Ereignisse am Lernen und darüber nachdachte, wie EntityListeners und EventSubscribers Arbeit.

Wie ich verstehe, ist EntityListener nur an eine Entität angeschlossen, während EventSubscriber-Methoden für alle Entitäten aufgerufen werden. Schließlich in der EventSubscriber Klasse muss ich etwas tun, wie folgt aus:

public function prePersist(LifecycleEventArgs $args) 
{ 
    $object = $args->getObject(); 

    if ($object instanceof xxxxxxx) { 
     $this->doSomething(); 
    } 
} 

So scheint es, dass, wenn ich auf Ereignisse einer einzigen Einheit zu hören brauchen, sollte ich EntityListener verwenden, und wenn ich auf Ereignisse hören wollen Von allen Doctrine-Entitäten sollte ich einen EventSubscriber verwenden.

Aber ... Blick auf die beliebtesten Bundles, wie FOSUserBundle, VichUploaderBundle, SonataMediaBundle, etc, sie alle verwenden EventSubscriber-Schnittstelle und keiner von ihnen verwenden EntityListener. Auch wenn sie nur auf eine Einheit hören müssen.

Ich habe noch kein Bündel gesehen, das EntityListener verwenden würde.

Meine Frage ist: warum?

Aus meiner Sicht sollte EntityListener effizienter sein, da es nur für eine einzelne Entität ausgelöst wird. Anrufen sagen 20 Voraktualisierung Abonnenten für jede Entität Update scheint nicht sehr optimiert?

Antwort

0

EntityListener ist nur eine Einheit angebracht, während EventSubscriber Methoden für alle Unternehmen aufgerufen.

Sie können EntityListeners nicht mit EventListeners/EventSubscribers vergleichen.

Different from Implementing Event Listeners an Entity Listener is invoked just to the specified entity.

Entity Listener: An entity listener is a lifecycle listener class used for an entity.

Auch Hörer: They sit at a level above the entities and allow you to implement re-usable behaviors across different entity classes.

@stof über Unterschiede zwischen dem Ereignis-Listener und Ereignisse Abonnent Unter Berufung:

Der Hauptvorteil der Teilnehmer (und der Grund, warum Symfony auf th geschaltet hat em in 2.1) ist, dass es die Kenntnis der Ereignisse in der Klasse statt in der Service-Definition hält, so dass es einfacher, den Hörer in anderen Kontexten (Silex zum Beispiel, weshalb Symfony-Code wurde geändert) wiederzuverwenden.

Auf der anderen Seite, registrieren Zuhörer durch die Service-Definition mehr Flexibilität an dem DI-Setup des Bündels gibt (so dass den Tag bedingt auf der Config zum Beispiel basierend hinzufügen)

+0

Sie sicher Sind Sie beziehen sich auf EntityListener und nicht EventListener? EntityListener scheint in Symfony 2.4 – Karolis

+0

hinzugefügt worden zu sein Sie mischen Dinge. EntityListener ist nicht EventListener/EventSybcriber. Sie arbeiten auf verschiedenen Ebenen der Lehre.Überprüfen Sie meine aktualisierte Antwort. –

Verwandte Themen