【问题标题】:CakePHP: Triggering Custom Event in BehaviourCakePHP:在行为中触发自定义事件
【发布时间】:2013-10-22 16:15:40
【问题描述】:

由于我的应用程序是如何构建的,我需要为beforeSaveAssociatedafterSaveAssociated 创建事件处理程序。为此,我更新了 AppModel.php 以包含以下相关代码:

public function saveAssociated(array $data = null, array $options = array()) {
    $this->after_save_options = NULL;

    $event = new CakeEvent('Model.beforeSaveAssociated', $this, array(&$data, &$options));
    $this->after_save_options = NULL;
    $this->getEventManager()->dispatch($event);

    if (parent::saveAssociated($data, $options)) {
        if (is_array($this->after_save_options)) {
            $curData = $this->data;
            $this->data = $this->_tempData;
            $event = new CakeEvent('Model.afterSaveAssociated', $this, $this->after_save_options);
            $this->after_save_options = NULL;
            $this->getEventManager()->dispatch($event);
            $this->data = $curData;
        }
        if ($this->_tempData) {
            $this->_tempData = FALSE;
        }
        return TRUE;
    }
    return FALSE;
}

public function implementedEvents() {
    return array_merge(parent::implementedEvents(), array(
        'Model.beforeSaveAssociated' => array(
            'callable' => 'beforeSaveAssociated',
            'passParams' => TRUE,
        ),
        'Model.afterSaveAssociated' => array(
            'callable' => 'afterSaveAssociated',
            'passParams' => TRUE,
        ),
    ));
}

虽然这对模型类中定义的任何beforeSaveAssociated 都有效,但每当我在行为中定义它时,它都不会被触发。如果我更新上面的saveAssociated 以触发Model.beforeSave(内置事件),它确实有效,据我所知,这不是行为未正确附加的问题。

非常感谢任何帮助,

【问题讨论】:

    标签: events cakephp behavior dispatchevent


    【解决方案1】:

    我认为这是因为 BehaviorCollection 只是在监听这些事件(取自类):

    public function implementedEvents() {
        return array(
            'Model.beforeFind' => 'trigger',
            'Model.afterFind' => 'trigger',
            'Model.beforeValidate' => 'trigger',
            'Model.afterValidate' => 'trigger',
            'Model.beforeSave' => 'trigger',
            'Model.afterSave' => 'trigger',
            'Model.beforeDelete' => 'trigger',
            'Model.afterDelete' => 'trigger'
        );
    }
    

    监听事件的不是行为,而是集合并在行为上触发它们。不去查就不能 100% 确定,但我认为这就是它的工作原理。

    你可以尝试做的是让需要直接接收这些事件的行为来监听事件。

    【讨论】:

    • 确实,将行为附加到模型修复了它。我将此添加到行为的setup 方法中:$model->getEventManager()->attach(function(array &$data, &$options) use ($model) {$this->beforeSaveAssociated($model, $data, $options);}, 'Model.beforeSaveAssociated', array('passParams' => TRUE));
    【解决方案2】:

    我认为问题是由于行为扩展了 ModelBehavior 而这些类不知道您在 AppModel 中创建的新方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多