我有一个奇怪的问题,每当我创建(比如说用户)模型的一个实例并附加一个记录侦听器时,该侦听器被多次调用(超时,第一次除外)。有没有人知道为什么会这样?
顺便说一句,我在我的CLI应用程序中使用Doctrine,当请求完成时,对象不会消失。
发布于 2011-12-22 18:54:55
在深入研究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();
}以上操作将导致每个listener都附加到一个table实例。然而,如果listener应该只被调用一次,那么您需要这样做。
// 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();
}注意:使用两种方法中的任何一种
https://stackoverflow.com/questions/8588343
复制相似问题