【问题标题】:Doctrine model instance firing record listener twice when listener is attached only once当侦听器仅附加一次时,Doctrine 模型实例触发记录侦听器两次
【发布时间】:2011-12-21 10:27:18
【问题描述】:

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

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

【问题讨论】:

    标签: orm doctrine-1.2 php


    【解决方案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 附加一个listenertable 实例。而如果侦听器应该只被调用一次,那么这就是你需要这样做的方式。

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

    注意:使用任何一种方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-05
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多