Events CakePHP:触发行为中的自定义事件
由于我的应用程序是如何构建的,我需要为Events CakePHP:触发行为中的自定义事件,events,cakephp,behavior,dispatchevent,Events,Cakephp,Behavior,Dispatchevent,由于我的应用程序是如何构建的,我需要为beforeaveassociated和afterSaveAssociated创建事件处理程序。为此,我更新了AppModel.php以包含以下相关代码: public function saveAssociated(array $data = null, array $options = array()) { $this->after_save_options = NULL; $event = new CakeEvent('Mode
beforeaveassociated
和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,
),
));
}
尽管这对模型类中定义的任何之前的相关都很有效,但每当我在行为中定义它时,它都不会被触发。如果我更新上面的saveAssociated
以触发Model.beforeSave
(内置事件),它确实可以工作,据我所知,这不是行为未正确附加的问题
非常感谢您的帮助,我认为问题的原因是行为扩展了ModelBehavior,而这些类不知道您在AppModel中创建的新方法我认为问题的原因是行为扩展了ModelBehavior,而这些类不知道您在AppModel中创建的新方法是因为行为扩展了ModelBehavior,而这些类不知道您在AppModel中创建的新方法我认为问题是因为行为扩展了ModelBehavior,而这些类不知道您在AppModel中创建的新方法我认为这是因为BehaviorCollection正在收听这些事件(摘自课堂):
不是行为侦听事件,而是集合并在行为上触发事件。不查就不能百分之百确定,但我认为这就是它的工作原理
您可以尝试做的是使需要接收这些事件的行为直接侦听事件。我认为这是因为BehaviorCollection正在侦听这些事件(取自类):
不是行为侦听事件,而是集合并在行为上触发事件。不查就不能百分之百确定,但我认为这就是它的工作原理
您可以尝试做的是使需要接收这些事件的行为直接侦听事件。我认为这是因为BehaviorCollection正在侦听这些事件(取自类):
不是行为侦听事件,而是集合并在行为上触发事件。不查就不能百分之百确定,但我认为这就是它的工作原理
您可以尝试做的是使需要接收这些事件的行为直接侦听事件。我认为这是因为BehaviorCollection正在侦听这些事件(取自类):
不是行为侦听事件,而是集合并在行为上触发事件。不查就不能百分之百确定,但我认为这就是它的工作原理
您可以尝试做的是让需要直接接收这些事件的行为来监听事件。事实上,将行为附加到模型中修复了它。我将此添加到Behavior的设置方法:$model->getEventManager()->attach(函数(数组&$data,&$options)使用($model){$this->beforeSaveAssociated($model,$data,$options);},'model.beforeSaveAssociated',数组('passParams'=>TRUE))代码>事实上,将行为附加到模型中修复了它。我将此添加到Behavior的设置方法:$model->getEventManager()->attach(函数(数组&$data,&$options)使用($model){$this->beforeSaveAssociated($model,$data,$options);},'model.beforeSaveAssociated',数组('passParams'=>TRUE))代码>事实上,将行为附加到模型中修复了它。我将此添加到Behavior的设置方法:$model->getEventManager()->attach(函数(数组&$data,&$options)使用($model){$this->beforeSaveAssociated($model,$data,$options);},'model.beforeSaveAssociated',数组('passParams'=>TRUE))代码>事实上,将行为附加到模型中修复了它。我将此添加到Behavior的设置方法:$model->getEventManager()->attach(函数(数组&$data,&$options)使用($model){$this->beforeSaveAssociated($model,$data,$options);},'model.beforeSaveAssociated',数组('passParams'=>TRUE))代码>
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'
);
}