2

Doctrine のイベント システムの奇妙な動作に気付きました。preFlushイベントについて読んだドキュメントでは:

preFlushEntityManager#flush()何よりも先に呼び出される

いいですね。しかし、イベントサブスクライバーを作成したとき、何かがおかしいことに気付きました.2preFlush回発生しましたが、onFlush1postFlush回だけ発生しました(これも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

ここに私の質問があります: 私は間違っていますか?

4

2 に答える 2

1

preFlushへの呼び出しごとにトリガーされます$em->flush()postFlushコミットする実際の変更セットがある場合にのみトリガーされます。この動作を変更する方法については、https://github.com/doctrine/doctrine2/pull/382を参照してください。postFlush

于 2014-05-08T18:54:01.157 に答える