Events 蛋糕事件是否异步处理?

Events 蛋糕事件是否异步处理?,events,cakephp,event-handling,cakephp-2.1,Events,Cakephp,Event Handling,Cakephp 2.1,目前,我的Cakephp应用程序中没有任何排队功能。在不久的将来我会需要的。上载将导致使用具有使用限制的外部API的batchjob,因此最好是在单独的队列威胁中处理它。 我没有这方面的经验,所以我将尝试一个不同但更简单的例子 用户操作导致发送电子邮件。目前,页面的加载延迟了服务器发送电子邮件所需的时间(相当长)。我想用事件系统来解决这个问题。(我知道我也可以使用afterRender函数来实现这一点,或者将其分派到shellTask,但这样我就什么也学不到了) 从示例页面: 我发现了这个例子:

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

用户操作导致发送电子邮件。目前,页面的加载延迟了服务器发送电子邮件所需的时间(相当长)。我想用事件系统来解决这个问题。(我知道我也可以使用afterRender函数来实现这一点,或者将其分派到shellTask,但这样我就什么也学不到了)

从示例页面: 我发现了这个例子:

// 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);
 }
现在我的问题是。。。在所有分派的事件完成后是否会呈现相应的视图?或者模型函数只是触发事件,然后忘记它? 最后一个选项在我看来更符合逻辑(这也类似于本文中提到的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)) {
        // ...
    }
    // ...
}
如果事件刚刚被触发(然后就被忘记了),那么您无法判断它是否在下一行代码中修改了传递的事件对象


我希望尽可能多地使用cake,但我不确定是否可以在没有shellTasks和外部队列的情况下获得所需的背景行为。有关于这些蛋糕事件的提示吗?

蛋糕事件是同步触发的。触发事件时,在继续执行其他指令之前,将调用所有可用侦听器

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

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

谢谢。你说“如果你愿意”。。但这正是我不想要的。我可以同步使用它们吗?我该怎么做?对不起,我是认真的。您不能异步使用它们。您可以创建自定义事件系统,也可以将它们分派到shell.Thx。我将用这个排队系统来解决这个问题:对于CakePHP