【发布时间】:2011-12-21 10:27:18
【问题描述】:
我有一个奇怪的问题,每当我创建(比如用户)模型的实例并附加一个记录侦听器时,侦听器都会被多次调用(第一次除外)。有人知道为什么会这样吗?
顺便说一句,我在我的 CLI 应用程序中使用 Doctrine,请求完成后对象不会消失。
【问题讨论】:
标签: orm doctrine-1.2 php
我有一个奇怪的问题,每当我创建(比如用户)模型的实例并附加一个记录侦听器时,侦听器都会被多次调用(第一次除外)。有人知道为什么会这样吗?
顺便说一句,我在我的 CLI 应用程序中使用 Doctrine,请求完成后对象不会消失。
【问题讨论】:
标签: orm doctrine-1.2 php
在挖掘 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 附加一个listener 到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();
}
注意:使用任何一种方法
【讨论】: