蛋糕事件是否异步处理



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

用户操作导致发送电子邮件。目前,由于服务器发送电子邮件所需的(相当长的)时间,页面的加载延迟了。我想使用事件系统来解决这个问题。(我知道我也可以这样做,使用这个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功能)

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

在关于使用results的示例中:

// 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)) {
        // ...
    }
    // ...
}

如果事件刚刚被触发(然后被遗忘),那么你就不能假设它在下一行代码中修改了传递的事件对象!

我想使用蛋糕尽可能多,但我不确定如果我能得到我想要的后台行为没有shellTasks和外部队列。关于这些蛋糕活动有什么建议吗?

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)) {
        // ...
    }
    // ...
}

相关内容

  • 没有找到相关文章

最新更新