После копания в источнике доктрины, это то, что я узнал. Слушатели привязаны к экземпляру таблицы, а не к отдельным экземплярам модели. Следовательно, когда слушатель привязан к модели, он внутренне передает его в экземпляр таблицы. Поэтому даже с новым экземпляром модели, если вы подключаете свежий экземпляр слушателя, будут вызваны оба прослушивателя!
Возможно, следующий пример может помочь понять проблему.
// 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();
}
N.B: Используйте один из подходов