我有一个奇怪的问题,每当我创建一个(例如User)模型的实例并附加一个记录监听器时,监听器被多次调用(超时除了第一次)。有没有人知道为什么会这样?
BTW,我在我的CLI应用程序中使用Doctrine,当请求完成时,对象不会消失。
答案 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();
}
上述操作会导致每listener
个table
个$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:使用其中一种方法