目前我的 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);
}
现在我的问题是......在所有调度的事件完成后会呈现相应的视图吗?还是模型函数只是触发事件然后忘记它?最后一个选项对我来说似乎更合乎逻辑(这也类似于文章中提到的 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 和外部队列的情况下获得我想要的背景行为。关于这些蛋糕活动的任何提示?