2012-10-05 97 views
6

Estoy buscando eliminar un Doctrine Extensions life cycle event listener desde un controlador.Eliminar el evento del ciclo de vida de Doctrine desde un controlador Symfony2

Necesito eliminar el oyente para los eventos de actualización porque necesito actualizar todos los nodos en el árbol a la vez. Algo que no es compatible con la biblioteca, pero es posible al configurar directamente el nivel correcto de izquierda, derecha, etc. ...

¿Es posible eliminar un ciclo de vida incluso desde un controlador? ¿Cuál es una posible solución para esta situación?

pensé que algo como esto podría funcionar, pero no

$evm = $em->getEventManager(); 

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

Fwiw en 2016, utilizando única raíz y ' NestedTreeRepository :: persistAsLastChildOf' en todos los niños Pude lograr la actualización masiva sin eliminar los oyentes. El código tiene menos de 10 líneas. – Taylan

Respuesta

14

sí, va a trabajar, pero hay diferentes eventos utilizados:

$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

Lo probé con todos los eventos en la matriz y todavía están disparando. – Mike

+0

sí, se actualizó el bloque de código – Gediminas

+0

Los eventos agregados con anotaciones directamente en la entidad no aparecen en estos oyentes de eventos, ¿hay alguna idea de a quién deshabilitar? – Leto

Cuestiones relacionadas