Экземпляр модели Doctrine запускает прослушиватель записи дважды, когда прослушиватель подключается только один раз - PullRequest
0 голосов
/ 21 декабря 2011

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

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

1 Ответ

1 голос
/ 22 декабря 2011

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

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

// 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: использовать любой из подходов

...