私は、(Userという)モデルのインスタンスを作成してレコードリスナーをアタッチするたびにリスナーが複数回呼び出される初めて)。それはどうして起こっているのか誰にも手掛かりがありますか?Doctrineモデルインスタンスは、リスナーが1回だけ接続されたときにレコードリスナーを2回発生させます。
私はCLIアプリケーションでDoctrineを使用していますが、要求が完了してもオブジェクトは消えません。
私は、(Userという)モデルのインスタンスを作成してレコードリスナーをアタッチするたびにリスナーが複数回呼び出される初めて)。それはどうして起こっているのか誰にも手掛かりがありますか?Doctrineモデルインスタンスは、リスナーが1回だけ接続されたときにレコードリスナーを2回発生させます。
私は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();
}
上記のすべての$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:アプローチのいずれかを使用し