2012-01-19 3 views
14

Dokumentacja mówi:Jak zmienić wartość pola w detektorze zdarzeń preUpdate?

zmian do pól przekazanych jednostek nie są rozpoznawane przez operację przepłukiwania już, użyj komputerowej przekazywany do zdarzenia change-zestaw do modyfikacji pierwotnych wartości pól.

Ale to też mówi:

getEntityChangeSet(), aby otrzymać kopię tablicy changeset. Zmiany w tej zwróconej tablicy nie wpływają na aktualizację.

Czy to oznacza, że ​​nie mogę zmienić pól obiektu w detektorach zdarzeń wstępnych? Jeśli nie, w jaki sposób mogę wykonać tę aktualizację?

+0

proszę podać link do tej dokumentacji – GusDeCooL

Odpowiedz

33

Widocznie trzeba ponownie obliczyć changeset się, aby zmiany odniosły skutek:

$em = $args->getEntityManager(); 
$uow = $em->getUnitOfWork(); 
$meta = $em->getClassMetadata(get_class($entity)); 
$uow->recomputeSingleEntityChangeSet($meta, $entity); 
+1

to działa! dzięki –

+4

Nie działa to w przypadku podmiotów powiązanych, nawet jeśli ustawiona jest adnotacja @cascade. – Simon

5

Alternatywnie można użyć klasy PreUpdateEventArgs (http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.Event.PreUpdateEventArgs.html). Na przykład:

public function preUpdate(PreUpdateEventArgs $args) 
{ 
    $entity = $args->getEntity(); 

    if ($entity instanceof Product) 
    { 
     $args->setNewValue(
      "discount", 
      123 
     ); 
    } 
} 
+11

Problem z tą metodą polega na tym, że chcesz ustawić właściwość setNewValue w polu, które nie zostało wcześniej zmienione. Ponieważ pole nie było jeszcze w zestawie zmian, zgłoszony zostanie błąd. Odpowiedź DavidW omija to ograniczenie. –