2011-12-21 10 views
0

私は、(Userという)モデルのインスタンスを作成してレコードリスナーをアタッチするたびにリスナーが複数回呼び出される初めて)。それはどうして起こっているのか誰にも手掛かりがありますか?Doctrineモデルインスタンスは、リスナーが1回だけ接続されたときにレコードリスナーを2回発生させます。

私はCLIアプリケーションでDoctrineを使用していますが、要求が完了してもオブジェクトは消えません。

答えて

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(); 
} 

上記のすべての$recordためtableインスタンスに取り付けられた1つlistenerの原因となります。一方、リスナーを1回だけ呼び出す必要がある場合は、これを行う必要があります。

// 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:アプローチのいずれかを使用し