Doctrine のイベント システムの奇妙な動作に気付きました。preFlush
イベントについて読んだドキュメントでは:
preFlush
EntityManager#flush()
何よりも先に呼び出される
いいですね。しかし、イベントサブスクライバーを作成したとき、何かがおかしいことに気付きました.2preFlush
回発生しましたが、onFlush
1postFlush
回だけ発生しました(これも1回発生すると想定してpreFlush
いました)。
興味深いことに、変更セットを計算するpreFlush
たびに呼び出されますUnitOfWork
- 現在管理されているエンティティの数と同じです。
簡単な例を次に示します (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 ***********
SopreFlush
は、管理対象エンティティ (新しいものを含む) ごとに 1 回 +EntityManager
実際にフラッシュするときに 1 回呼び出されます。
私の意見では、preFlush
イベントは操作ごとに 1 回呼び出す必要がありますEntityManager#flush()
(他のフラッシュ イベントと同様)。
その動作を生成するコードを見つけました: https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/UnitOfWork.php#L536
ここに私の質問があります: 私は間違っていますか?