まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 2007-02-15 (木) 2007-02-20 (火) > 最新


2007-02-17 (土)

Piece Framework のサンプルカウンタ

Piece Framework を試してみている。 Piece_Flow のアーカイブの中にあったテスト用のファイルを少し手直しして、 ごくごく簡単なサンプルを作ってみた。 カウンタというか、へぇボタンみたいなやつだ。 ただこのサンプルは、必ず同じ state に戻って来るという点があまりよろしくない。 そのせいで「戻る」ボタンを押した時の動作がおかしいが、 あくまでも練習ということで大目に見て欲しい。

  • config/flows/Counter.yaml
firstState: DisplayForm

viewState:
  - name: DisplayForm
    view: Counter
    activity:
      method: setView
    transition:
      - event: increase
        nextState: done
        action:
          class: CounterAction
          method: increase
      - event: reset
        nextState: done
        action:
          class: CounterAction
          method: reset

actionState:
  - name: done
    transition:
      - event: succeed
        nextState: DisplayForm

initial:
  class: CounterAction
  method: initialize
  • actions/CounterAction.php
<?php

require_once 'Piece/Flow/Action.php';

class CounterAction extends Piece_Flow_Action
{
    function initialize()
    {
        $this->_flow->setAttribute('counter', 1);
    }

    function increase()
    {
        $counter = $this->_flow->getAttribute('counter');
        $this->_flow->setAttribute('counter', $counter + 1);
        return 'succeed';
    }

    function reset()
    {
        $this->initialize();
        return 'succeed';
    }

    function setView()
    {
        $counter = $this->_flow->getAttribute('counter');
        $viewElement =& $this->_payload->getViewElement();
        $viewElement->setElement('counter', $counter);
    }
}

?>
  • templates/Counter/Counter.html
<p>Counter: {counter}</p>
<form>
  <input type="hidden" name="{__flowExecutionTicketKey}" value="{__flowExecutionTicket}" id="flowExecutionTicket" />
  <input type="submit" name="{__eventNameKey}_increase" value="Increase" />
  <input type="submit" name="{__eventNameKey}_reset" value="Reset" />
</form>

あとは piece-unity-config.yaml にこのフローを追加するといった作業も必要だが、 とりあえずこれはこれでちゃんと動作する。

さて、ここからが本題。 マニュアルに書かれているアクション継続の説明を読んで、 その時は、ふーん、と思っていたのだが、 しばらく経った後で、書かれていることの意味が頭に染み渡ってきた。 フロー変数を意識する必要が無いだって? もしかして、アクション継続の機能を有効にすればこういう風に書けるのか?

<?php

require_once 'Piece/Flow/Action.php';

class CounterAction extends Piece_Flow_Action
{
    var $_counter;

    function initialize()
    {
        $this->_counter = 1;
    }

    function increase()
    {
        $this->_counter++;
        return 'succeed';
    }

    function reset()
    {
        $this->initialize();
        return 'succeed';
    }

    function setView()
    {
        $viewElement =& $this->_payload->getViewElement();
        $viewElement->setElement('counter', $this->_counter);
    }
}

?>

試してみたところ、これでちゃんと動いた。こりゃすごいや。

要するに、今までの通常の Web アプリだったら、 セッションに値を保存しておいて、 次の画面でセッションから値を取り出して、 といったことをほぼ手作業でやっていたのに、 そういった処理を何も書かなくて済む。 Piece Framework はステートフル、と書かれていたのがようやく実感できた。

Tags: Piece | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のリンク元

編集