原则模型实例在侦听器只附加一次时触发两次记录侦听器


Doctrine model instance firing record listener twice when listener is attached only once

我遇到了一个奇怪的问题,每当我创建一个(比如User)模型的实例并附加一个记录侦听器时,侦听器就会被调用多次(除了第一次之外)。有人知道为什么会这样吗?

BTW,我在我的CLI应用程序中使用Doctrine,当请求完成时对象不会死亡。

在挖掘Doctrine源码后,这是我所学到的。侦听器附加到表实例,而不是模型的单个实例。因此,当侦听器附加到模型时,它会在内部将其传递给表实例。因此,即使有新的模型实例,如果附加新的侦听器实例,两个侦听器都将被调用!

也许,下面的例子可以帮助你理解这个问题。

// WRONG WAY
foreach ($records as $record) {
    // Table returns instance of Model_User
    $model = Model_UserTable::getInstance()->make( $record );
    $listener = new Doctrine_Listener_SomeListener();
    // following will attach new listener for each model instance
    $model->addListener( $listener );
    $model->save();
}

以上将导致每个$record都有一个listener附加到table实例。然而,如果侦听器应该只调用一次,那么您需要这样做。

// RIGHT WAY
$listener = new Doctrine_Listener_SomeListener();
$table = Model_UserTable::getInstance();
$table->addRecordListener( $listener ); // approach #1
foreach ($records as $record) {
    $model = $table->make( $record );
    $model->addListener( $listener ); // approach #2
    $model->save();
}

N。B:使用