2011-12-21 2 views

답변

1

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마다 $recordtable 인스턴스에 대한 부착의 원인이됩니다. 반면 리스너를 한 번만 호출해야하는 경우 여기에서 수행해야합니다.

// 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 : 접근 방법 중 하나를 사용