Cakephp每个事件调度多个处理程序

时间:2014-09-08 21:06:40

标签: php cakephp

我想在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;
}

当我运行这个时,我得到的是两种方法之一的结果。

1 个答案:

答案 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);
}

我会实现处理事件监听器内部数据的实际逻辑,而是将其放入模型中。在那里的其他地方更容易测试和重复使用。