蛋糕事件是异步处理的吗?

时间:2013-03-05 11:10:38

标签: events cakephp event-handling cakephp-2.1

目前我的Cakephp应用程序中没有任何排队功能。我将在不久的将来需要它。上传将导致批处理使用具有使用限制的外部API,因此最好是在具有队列的单独威胁中进行处理。 我对此没有任何经验,所以我将尝试一个不同但更简单的例子。

用户操作会导致发送电子邮件。目前,页面的加载延迟了服务器发送电子邮件所花费的(相当长的)时间。我想使用Event系统来解决这个问题。 (我知道我也可以使用afterRender函数执行此操作,或者将其发送到shellTask​​,但这样我就不会学到任何东西)

从示例页面:http://book.cakephp.org/2.0/en/core-libraries/events.html 我找到了这个例子:

// Cart/Model/Order.php
App::uses('CakeEvent', 'Event');
class Order extends AppModel {

    public function place($order) {
        if ($this->save($order)) {
            $this->Cart->remove($order);
            $this->getEventManager()->dispatch(new CakeEvent('Model.Order.afterPlace', $this, array(
                'order' => $order
            )));
            return true;
        }
        return false;
    }
}

假设该函数由控制器动作调用:

 public function place_order() {
     $result = $this->Order->place($this->request->data);
     $this->set('result', $result);
 }

现在我的问题......在所有调度事件完成后是否会呈现相应的视图?或者Model函数会触发事件然后忘掉它吗? 最后一个选项对我来说似乎更合乎逻辑(它也类似于文章中提到的jQuery功能)

问题是如果这是真的,我不理解后面的例子:

在使用结果的示例中:

// Using the event result
public function place($order) {
    $event = new CakeEvent('Model.Order.beforePlace', $this, array('order' => $order));
    $this->getEventManager()->dispatch($event);
    if (!empty($event->result['order'])) {
        $order = $event->result['order'];
    }
    if ($this->Order->save($order)) {
        // ...
    }
    // ...
}

如果事件刚被触发(然后忘记了),你就无法在下一行代码中修改传递的事件对象!

我想尽可能多地使用蛋糕,但我不确定如果没有shellTask​​s和外部队列,我是否可以获得所需的背景行为。关于这些蛋糕活动的任何提示?

1 个答案:

答案 0 :(得分:2)

Cake事件同步触发。触发事件时,将继续调用所有可用的侦听器,然后再继续执行其他说明。

您可以在第二个例子中将其想象为:

public function place($order) {
    $event = new CakeEvent('Model.Order.beforePlace', $this, array('order' => $order));
    $this->getEventManager()->dispatch($event);  // -> all listeners are called at this point
    // ... here you can assume your $event was modified
    if (!empty($event->result['order'])) {
        $order = $event->result['order'];
    }
    if ($this->Order->save($order)) {
        // ...
    }
    // ...
}
相关问题