当侦听器仅连接一次时,Doctrine模型实例触发记录侦听器两次

时间:2011-12-21 10:27:18

标签: orm doctrine-1.2 php

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

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

1 个答案:

答案 0 :(得分:1)

在深入了解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();
}

上述操作会导致每listenertable$record个实例附加一个// 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(); } 。如果只应该调用一次监听器,那么这就是你需要做的。

{{1}}

N.B:使用其中一种方法