0

アプリケーションの構築方法のため、 と のイベント ハンドラを作成する必要がありbeforeSaveAssociatedますafterSaveAssociated。これを可能にするために、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と、動作します。そのため、私が知る限り、動作が適切にアタッチされていないという問題はありません。

どんな助けでも大歓迎です、

4

2 に答える 2

3

これは、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% 確実ではありませんが、そのように機能していると思います。

あなたがしようとすることができるのは、イベントをリッスンするためにこれらのイベントを直接受け取る必要がある動作を作成することです。

于 2013-10-22T16:55:08.790 に答える
0

動作が ModelBehavior を拡張し、それらのクラスが AppModel で作成した新しいメソッドを認識していないため、問題が発生していると思います

于 2013-10-22T16:28:52.960 に答える