2012-10-05 3 views
6

Sto cercando di rimuovere un Doctrine Extensions life cycle event listener da un controller.Rimuovi evento ciclo vitale Doctrine da un controller Symfony2

Ho bisogno di rimuovere il listener per gli eventi di aggiornamento perché ho bisogno di aggiornare tutti i nodi nella struttura in una volta. Qualcosa che non è supportato dalla libreria, ma è possibile impostando direttamente il corretto livello sinistro, destro, ecc ...

E 'possibile rimuovere un ciclo di vita anche dall'interno di un controller? Qual è una possibile soluzione per questa situazione.

ho pensato qualcosa di simile potrebbe funzionare, ma non ha

$evm = $em->getEventManager(); 

$listener = new \Gedmo\Tree\TreeListener(); 
$evm->removeEventListener(array('postUpdate'), $listener); 
+0

FWIW nel 2016, utilizzando un'unica radice & ' NestedTreeRepository :: persistAsLastChildOf' su tutti i bambini Sono stato in grado di ottenere l'aggiornamento collettivo senza rimuovere gli ascoltatori. Il codice è inferiore a 10 righe. – Taylan

risposta

14

sì che funzionerà, ma ci sono diversi eventi utilizzati:

$listenerInst = null; 
$em; /* entity manager */ 
foreach ($em->getEventManager()->getListeners() as $event => $listeners) { 
    foreach ($listeners as $hash => $listener) { 
     if ($listener instanceof WantedListenerClass) { 
      $listenerInst = $listener; 
      break 2; 
     } 
    } 
} 
$listenerInst || die('Listener is not registered in the event manager'); 
// then you can remove events you like: 
$evm = $em->getEventManager(); 
$evm->removeEventListener(array('onFlush'), $listenerInst); 
+0

L'ho provato con tutti gli eventi dell'array e stanno ancora sparando. – Mike

+0

sì, aggiornato il blocco di codice – Gediminas

+0

Gli eventi aggiunti con le annotazioni direttamente nell'entità non appaiono in questi ascoltatori di eventi, qualche idea su chi disabilitarli? – Leto