2011-12-21 49 views
0

我有一個奇怪的問題,每當我創建(說用戶)模型的實例並附加一個記錄偵聽器,偵聽器被調用多次(超時第一次)。有沒有人有任何線索,爲什麼會發生?原則模型實例觸發記錄偵聽器兩次,當偵聽器只連接

順便說一句,我在我的CLI應用程序中使用Doctrine,其中對象在請求完成時不會失效。

回答

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:請使用方法的