2012-05-24 13 views
57

Sto lavorando nel framework Symfony2 e mi chiedo quando si dovrebbe usare un utente Doctrine contro un listener. Doctrine's documentation per gli ascoltatori è molto chiaro, tuttavia gli abbonati sono piuttosto ignorati. Symfony's cookbook entry è simile.Listener Doctrine contro Subscriber

+0

Ross Tuck aveva un Doctrine2 parlare al DutchPHPConference qualche giorno fa. Ha anche trattato gli eventi in Doctrine2 e le sue diapositive sono qui: http://www.slideshare.net/rosstuck/extending-doctrine-2-for-your-domain-model-13257781 forse potrebbe essere qualche info/aiuto extra per te. –

risposta

66

Dal mio punto di vista, c'è solo una differenza sostanziale:

  • l'ascoltatore è firmato specificando gli eventi su cui è in ascolto.
  • L'Abbonato ha un metodo dire al dispatcher quali eventi si sta ascoltando

Questo potrebbe non sembrare una grande differenza, ma se ci pensate, ci sono alcuni casi in cui si desidera utilizzare uno sopra l'altro:

  • È possibile assegnare un ascoltatore a molti dispatcher con diversi eventi, in quanto sono impostati al momento della registrazione. Devi solo accertarti che tutti i metodi siano presenti nell'ascoltatore
  • È possibile modificare gli eventi a cui è iscritto un utente in fase di esecuzione e anche dopo aver registrato l'utente modificando il valore di ritorno di getSubscribedEvents (Pensa al momento in cui ascolti a un evento molto rumoroso e si desidera eseguire qualcosa una sola volta)

Ci potrebbero essere altre differenze che non sono a conoscenza di!

+16

Quindi, in poche parole, un abbonato è un ascoltatore in cui l'elenco degli eventi monitorati è mutabile? In 'getSubscribedEvents' dovrei quindi restituire un array, qualcosa come' array (Events :: prePersist, Events :: postUpdate) 'Suppongo che? – nurikabe

+5

Sì. Dai un'occhiata qui: http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/events.html#the-event-system – Sgoettschkes

5

Entrambi consentono di eseguire qualcosa su un particolare evento pre/post persistono ecc

Tuttavia ascoltatori consentono solo di eseguire i comportamenti incapsulati all'interno della vostra Entità. Quindi un esempio potrebbe essere l'aggiornamento di un timestamp "date_edited".

Se è necessario spostarsi all'esterno del contesto di Entity, è necessario un sottoscrittore. Un buon esempio potrebbe essere quello di chiamare un'API esterna o se è necessario utilizzare/ispezionare i dati non direttamente correlati all'entità.

+5

Potrei essere frainteso, ma questo suona come la differenza tra un callback del ciclo di vita e un listener di eventi? Sto cercando di determinare quando potrei usare (in termini Symfony2) un 'doctrine.event_subscriber' in opposizione a' doctrine.event_listener'. – nurikabe

+0

Hai ragione, ho letto male la tua domanda, scusa. –

7

Si dovrebbe usare abbonato evento quando si vuole affrontare con più eventi in una classe, per esempio in questo symfony2 doc page article, si può notare che il listener di eventi in grado di gestire un solo evento, ma diciamo che si vuole affrontare una serie di eventi per un'entità, prePersist, preUpdate, postPersist ecc ... se usi listener di eventi dovresti codificare diversi listener di eventi, uno per ogni evento, ma se vai con un sottoscrittore di eventi devi solo codificare una classe l'evento susbcriber, guarda che con il sottoscrittore dell'evento puoi gestire più di un evento in una classe, questo è il modo in cui lo uso, preferisco il codice focalizzato su ciò di cui il modello ha bisogno, un esempio di questo può essere se vuoi gestire diversi eventi del ciclo di vita globaly solo per un gruppo di entità, per fare ciò è possibile codificare una classe genitore e definire quei metodi globali al suo interno, quindi fare yo le tue entità ereditano quella classe e più tardi nel tuo evento susbcriber ti iscrivi ad ogni evento che vuoi, prePersist, preUpdate, postPersist ecc ... e poi chiedi quella classe genitore ed esegui quei metodi globali.

+3

Forse ti ho frainteso, ma nel mio sperimentare un ascoltatore può gestire più eventi, ad es un Listener può definire le azioni per prePersist, preUpdate, onFlush, ecc. –

+0

@ChadwickMeyer i secondo che 'Questo listener può ascoltare uno o più eventi e viene notificato ogni volta che questi eventi vengono inviati.' direttamente dalla documentazione – Dheeraj

8

Non so se è fatto accidentalmente o intenzionalmente .. Ma gli abbonati hanno la priorità più alta che gli ascoltatori - https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php#L73-L98

Dal lato dottrina, non importa quello che è (ascoltatore o sottoscrittore), alla fine entrambi sono registrati come ascoltatori - https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php#L137-L140

Questo è quello che ho notato.

2

Un'altra cosa importante: Doctrine EventSubscribers non ti consente di impostare una priorità.

Altre notizie su questo tema here

+0

La lampadina si accende. Grazie! – nurikabe

Problemi correlati