2013-03-05 66 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