我刚刚注意到教条事件系统的奇怪行为。在我读到的文档中,关于preFlush事件:
preFlush是在EntityManager#flush()之前调用的
听起来不错。但当我创建事件订阅服务器时,我发现有问题-preFlush发生了两次,而onFlushpostFlush只发生了一次(我假设preFlush也发生了一次)。
有趣的是,每次preFlush计算变更集时都会调用UnitOfWork-等于当前托管实体的数量。
下面是一个简单的例子(原则2.4,我没有使用symfony):

// event subscriber class:

class Subscriber implements EventSubscriber {

    public function getSubscribedEvents() {
        return array(Events::preFlush, Events::onFlush, Events::postFlush);
    }

    public function preFlush() {
        echo '********** PRE FLUSH ***********' . "\n";
    }

    public function onFlush() {
        echo '********** ON FLUSH ***********' . "\n";
    }

    public function postFlush() {
        echo '********** POST FLUSH ***********' . "\n";
    }

}

// test:

$em->getEventManager()->addEventSubscriber(new Subscriber());

for($i = 0; $i < 5; $i++) {
    echo 'i = ' . $i . "\n";
    $u = new Unit();  // Unit is sample entity - very simple one with no associations
    $u->setName('unit');
    $u->setSymbol('u');

    $em->persist($u);
    $em->flush();
}

产生输出:
i = 0
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** ON FLUSH ***********
********** POST FLUSH ***********
i = 1
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** ON FLUSH ***********
********** POST FLUSH ***********
i = 2
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** ON FLUSH ***********
********** POST FLUSH ***********
i = 3
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** ON FLUSH ***********
********** POST FLUSH ***********
i = 4
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** PRE FLUSH ***********
********** ON FLUSH ***********
********** POST FLUSH ***********

因此,每个托管实体(包括新实体)调用一次preFlush,当EntityManager实际刷新时调用一次。
我认为每个preFlush操作都应该调用一次EntityManager#flush()事件(与其他刷新事件一样)。
我发现产生这种行为的代码:https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/UnitOfWork.php#L536
我的问题是:我是错了,教义是错了,还是我遗漏了什么?

最佳答案

我不知道这是不是故意的,但似乎合乎逻辑。调用的数目与托管实体的数目相匹配,但可能是因为该方法旨在允许您强制实体的完整性。
注意PreFlush调用的数量并没有增加。如果每个实体的数据在刷新时发生更改,则将为每个实体再次调用PostFlush
理想情况下,不带参数的PostFlush应该只在脚本执行结束时调用(或者至少调用几次)。为了确保在调用特定实体时对其进行处理和刷新,请将该实体作为参数传递给$em->flush()方法。

10-06 02:18