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