Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在preFlush处理程序中持久化新的关联实体(无限递归)_Php_Doctrine Orm - Fatal编程技术网

Php 在preFlush处理程序中持久化新的关联实体(无限递归)

Php 在preFlush处理程序中持久化新的关联实体(无限递归),php,doctrine-orm,Php,Doctrine Orm,我已经为给定的实体Foo创建了一个实体侦听器,它侦听preFlush事件。每当更新或创建Foo实体时,我想创建一个新的Bar实体。 我的问题是,computeChangeSets()再次触发preFlush事件,导致无休止的循环。有人有解决方案或替代方法来处理这个用例吗 class SomeListener { /** * @ORM\preFlush */ public function onPreFlush(Foo $foo, PreFlushEventAr

我已经为给定的实体
Foo
创建了一个实体侦听器,它侦听
preFlush
事件。每当更新或创建
Foo
实体时,我想创建一个新的
Bar
实体。 我的问题是,
computeChangeSets()
再次触发preFlush事件,导致无休止的循环。有人有解决方案或替代方法来处理这个用例吗

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
    }
}

在计算更改集之前调度
PreFlush
事件

换句话说:这里不需要调用
重新计算SingleEntityChangeSet()
computeChangeSets()
。删除这些,你的听众应该工作良好


PS:
computeChangeSets()
将计算所有更改集,因此您无需同时调用
recomputeSingleEntityChangeSet()

谢谢您的回答。我很确定我已经尝试过了,但是我的实体没有持久化到数据库。关联被设置为“级联持续”。我不在atm机上工作,明天我试试你的建议。