2011-12-21 1 views
0

У меня странная проблема, когда всякий раз, когда я создаю экземпляр модели (например, User) и присоединяю прослушиватель записей, слушатель вызывается несколько раз (сверхурочное время, кроме первый раз). Кто-нибудь знает, почему это происходит?Пример экземпляра экземпляра модели Doctrine дважды, когда слушатель подключается только один раз

BTW, я использую Doctrine в своем приложении CLI, где объекты не умирают, когда запросы завершены.

ответ

1

После копания в источнике доктрины, это то, что я узнал. Слушатели привязаны к экземпляру таблицы, а не к отдельным экземплярам модели. Следовательно, когда слушатель привязан к модели, он внутренне передает его в экземпляр таблицы. Поэтому даже с новым экземпляром модели, если вы подключаете свежий экземпляр слушателя, будут вызваны оба прослушивателя!

Возможно, следующий пример может помочь понять проблему.

// 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: Используйте один из подходов