2013-03-05 62 views
2

目前我的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); 
} 

现在我的问题...将相应的视图中的所有调度的事件后呈现完成?或者模型功能是否会触发事件并忘记它? 最后的选择似乎更符合逻辑的我(这也类似于提到的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)) { 
     // ... 
    } 
    // ... 
} 

如果只是触发事件(然后忘了),有没有办法可以asume它已经修改了通过事件对象的下一行代码!

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

回答

2

Cake Events被同步触发。当触发事件时,在继续执行其他指令之前调用所有可用的侦听器。

你能想象它在你的第二个例子是:

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

THX。你说“如果你想要”......但这正是我不想要的。我可以同时使用它们吗?我怎么做? – Jeroen 2013-03-05 12:16:33

+0

对不起,我的意思是字面意思。你不能异步使用它们。您可以创建自定义事件系统,也可以将它们发送到shell。 – Calin 2013-03-05 12:32:48

+1

Thx。我将用这个排队系统来解决它:CakePHP的https://github.com/dereuromark/cakephp_queue – Jeroen 2013-03-06 14:18:24