我想在cakephp中的一个事件上运行两个处理程序。我想将数据从侦听器返回到调用它来保存的类,就像在cake docs中一样。我尝试了他们的例子,但我遇到了这两个问题:1)我似乎只能得到一个事件要触发; 2)我无法弄清楚如何使用$ event->结果在方法之间传递数据并回到我的模型保存。
这是我的代码:(案例有点弥补,但说明了问题。)
/app/Model/User.php
public function afterSave($created) {
if ($created) {
$event = new CakeEvent('Model.User.created', $this, array(
'id' => $this->id,
'data' => $this->data[$this->alias],
'result' => $event->result
));
$this->getEventManager()->dispatch($event);
if (!empty($event->result)) {
$this->save($event->result);
}
}
return true;
}
/app/Event/UserListener.php
public function implementedEvents() {
return array(
'Model.User.created' => 'method1',
'Model.User.created' => 'method2',
);
}
public function method1(CakeEvent $event) {
//do something
$event->result['User']['role_id'] = 1;
}
public function method2(CakeEvent $event) {
//do something else
$event->result['User']['status_id'] = 2;
}
当我运行这个时,我得到的是两种方法之一的结果。
答案 0 :(得分:2)
基本的php语言“问题”,这里合乎逻辑......
return array(
'Model.User.created' => 'method1',
'Model.User.created' => 'method2',
);
...第二个键与第一个键相同,因此您将覆盖第一个键的值。这不起作用。
我建议为事件设置一种方法并执行以下操作:
public function method1(CakeEvent $event) {
$event->result['User']['role_id'] = ClassRegistry::init('User')->doSomethingWithId($event->data);
$event->result['User']['status_id'] = ClassRegistry::init('User')->doSomethingWithStatus($event->data);
}
我会不实现处理事件监听器内部数据的实际逻辑,而是将其放入模型中。在那里的其他地方更容易测试和重复使用。