2

現時点では、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 機能にも似ています)。

問題は、これが本当なら、後の例が理解できないということです:

結果の使用に関する例:

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

イベントがトリガーされたばかりの (そして忘れられた) 場合、コードの次の行で渡されたイベント オブジェクトが変更されたと想定することはできません。

できるだけケーキを使いたいのですが、shellTask​​s と外部キューなしで目的のバックグラウンド動作が得られるかどうかはわかりません。これらのケーキイベントに関するヒントはありますか?

4

1 に答える 1

2

ケーキイベントは同期的にトリガーされます。イベントがトリガーされると、他の指示に進む前に、使用可能なすべてのリスナーが呼び出されます。

2番目の例では次のように想像できます。

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)) {
        // ...
    }
    // ...
}
于 2013-03-05T11:34:12.500 に答える