gpt4 book ai didi

php - Doctrine2 多次引发 preFlush(?)

转载 作者:搜寻专家 更新时间:2023-10-30 20:28:16 25 4
gpt4 key购买 nike

我刚刚注意到 Doctrine 事件系统的奇怪行为。在文档中,我阅读了有关 preFlush 事件的信息:

preFlush is called at EntityManager#flush() before anything else

听起来不错。但是当我创建事件订阅者时,我发现有些不对劲 - preFlush 发生了两次,而 onFlushpostFlush 只发生了一次(我假设preFlush 也发生一次)。

有趣的是,每次 UnitOfWork 计算变更集时都会调用 preFlush - 等于当前管理的实体的数量。

这是一个简单的例子(Doctrine 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

这是我的问题:我错了吗,Doctrine 工作不正确还是我还缺少其他东西?

最佳答案

我不知道这是不是故意的,但它看起来合乎逻辑。 PreFlush 调用的数量与托管实体的数量相匹配,但可能是因为该方法旨在允许您强制执行实体的完整性。

请注意 PostFlush 调用的次数没有增加。如果每个实体的数据在刷新时发生变化,那么将为每个实体再次调用 PostFlush

理想情况下,不带参数的 $em->flush() 应该只在脚本执行结束时调用(或者至少调用几次)。为了确保在调用特定实体时对其进行处理和刷新,请将该实体作为参数传递给 flush 方法。

关于php - Doctrine2 多次引发 preFlush(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19913615/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com