Saving a new linked object in a preFlush handler (infinite recursion)

I created an object listener for this object Foothat listens for the event preFlush. I want to create a new object Barwhenever the object is Fooupdated or created. My problem is the preFlush event fires again computeChangeSets(), which leads to an infinite loop. Does anyone have a solution or alternative approach to this use case?

class SomeListener
{
    /**
     * @ORM\preFlush
     */
    public function onPreFlush(Foo $foo, PreFlushEventArgs $eventArgs)
    {
        $em = $eventArgs->getEntityManager();
        $uow = $em->getUnitOfWork();

        $bar = new Bar();
        $bar->setX('test');
        $foo->addBar($bar);

        $em->persist($bar);

        $meta = $em->getClassMetadata(get_class($foo));
        $uow->recomputeSingleEntityChangeSet($meta, $foo);
        $uow->computeChangeSets(); //This line invokes preFlush listener again
    }
}
+3
source share
1 answer

The event is PreFlushdispatched before the calculation of change sets.

In other words: your calls recomputeSingleEntityChangeSet()and computeChangeSets()are not needed. Remove those and your listener should work fine!

PS: computeChangeSets() , recomputeSingleEntityChangeSet() .

+1

All Articles