나는 (사용자) 모델의 인스턴스를 만들고 레코드 리스너를 연결할 때마다 리스너가 여러 번 호출됩니다. 처음으로). 누구가 일어나고 있는지에 관해 어떤 단서가 있습니까?Doctrine 모델 인스턴스가 리스너를 한 번만 연결하면 레코드 수신기가 두 번 실행됩니다.
현재 CLI 응용 프로그램에서 Doctrine을 사용하고 있는데 요청이 완료되면 개체가 죽지 않습니다.
나는 (사용자) 모델의 인스턴스를 만들고 레코드 리스너를 연결할 때마다 리스너가 여러 번 호출됩니다. 처음으로). 누구가 일어나고 있는지에 관해 어떤 단서가 있습니까?Doctrine 모델 인스턴스가 리스너를 한 번만 연결하면 레코드 수신기가 두 번 실행됩니다.
현재 CLI 응용 프로그램에서 Doctrine을 사용하고 있는데 요청이 완료되면 개체가 죽지 않습니다.
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
마다 $record
table
인스턴스에 대한 부착의 원인이됩니다. 반면 리스너를 한 번만 호출해야하는 경우 여기에서 수행해야합니다.
// 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 : 접근 방법 중 하나를 사용