0
我有一個奇怪的問題,每當我創建(說用戶)模型的實例並附加一個記錄偵聽器,偵聽器被調用多次(超時第一次)。有沒有人有任何線索,爲什麼會發生?原則模型實例觸發記錄偵聽器兩次,當偵聽器只連接
順便說一句,我在我的CLI應用程序中使用Doctrine,其中對象在請求完成時不會失效。
我有一個奇怪的問題,每當我創建(說用戶)模型的實例並附加一個記錄偵聽器,偵聽器被調用多次(超時第一次)。有沒有人有任何線索,爲什麼會發生?原則模型實例觸發記錄偵聽器兩次,當偵聽器只連接
順便說一句,我在我的CLI應用程序中使用Doctrine,其中對象在請求完成時不會失效。
挖掘出主義來源後,這就是我所學到的。監聽器連接到表實例,而不是模型的單個實例。因此,當偵聽器連接到模型時,它會在內部將它傳遞給表實例。因此,即使使用新的模型實例(如果您附加了偵聽器的新實例),兩個偵聽器都將被調用!
也許,下面的例子可能有助於理解問題。
// 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:請使用方法的