首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >原理模型实例触发记录监听器两次,监听器仅附加一次

原理模型实例触发记录监听器两次,监听器仅附加一次
EN

Stack Overflow用户
提问于 2011-12-21 18:27:18
回答 1查看 113关注 0票数 0

我有一个奇怪的问题,每当我创建(比如说用户)模型的一个实例并附加一个记录侦听器时,该侦听器被多次调用(超时,第一次除外)。有没有人知道为什么会这样?

顺便说一句,我在我的CLI应用程序中使用Doctrine,当请求完成时,对象不会消失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-22 18:54:55

在深入研究Doctrine源代码之后,这就是我所学到的。侦听器附加到表实例,而不是模型的单个实例。因此,当侦听器附加到模型时,它会在内部将其传递给表实例。因此,即使有了模型的新实例,如果您附加了新的侦听器实例,两个侦听器都将被调用!

也许,下面的例子可能有助于理解这个问题。

代码语言:javascript
复制
// 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都附加到一个table实例。然而,如果listener应该只被调用一次,那么您需要这样做。

代码语言:javascript
复制
// 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();
}

注意:使用两种方法中的任何一种

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8588343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档