Piece Frameworkによるブログアプリケーションの作成

第8回 データベース設計とデータアクセスコードの実装(1)

この記事を読むのに必要な時間:およそ 8.5 分

データアクセスコード配置先の検討とフローの変更-新規エントリー入力フロー

Piece_ORMを使ったデータアクセスの準備が整いましたので,いよいよアプリケーションにデータアクセスコードを組み込んでいきます。新規エントリー入力フロー以外の2つのフローでは,レコードの存在が前提になってきますので,最初に新規エントリー入力フローに対してデータアクセスコードを実装することにします。

さて,いきなりコードを書き始めたいところですが,まずはコードの配置先について検討してみましょう。新規エントリー入力フローにおいてレコード作成が期待されるタイミングは,新規エントリー入力確認画面のCreateボタンがクリックされたときになります。

新規エントリー入力確認画面

新規エントリー入力確認画面

現在のフロー定義では,CreateボタンがクリックされるとDisplayNewFinishFromDisplayNewConfirmイベントが発生し,DisplayNewFinishステートに遷移します。コードの配置先として考えられるのは,遷移イベント発生時,ステートからの退場時,ステートへの入場時,そしてステート更新時のいずれかのイベントハンドラです。現在のところ,最もシンプルかつ意図が明確なことから,筆者はビュー関連以外のコードをアクションステートのアクティビティ(ステート更新時のイベントハンドラに対応)に配置することを推奨しています。しかしながら,現在のフロー定義にはまだ対応するアクションステートが存在しないため,新たに作成する必要があります。以上を踏まえて,フロー定義にステートProcessCreateNewを追加し,そのアクティビティを準備します。変更前後のフロー定義ファイル及びステートチャート図を下記に示します。

(変更前)/path/to/pieceblog/web/webapp/config/flows/Entry/New.yaml

...
  - name: DisplayNewConfirm
    view: NewConfirm
    activity:
      class: Entry_NewAction
      method: doActivityOnDisplayNewConfirm
    transition:
      - event: DisplayNewFinishFromDisplayNewConfirm 
        nextState: DisplayNewFinish
      - event: DisplayNewFromDisplayNewConfirm
        nextState: DisplayNew
...

(変更前)新規エントリー入力フローのステートチャート図

(変更前)新規エントリー入力フローのステートチャート図

(変更後)/path/to/pieceblog/web/webapp/config/flows/Entry/New.yaml

...
  - name: DisplayNewConfirm
    view: NewConfirm
    activity:
      class: Entry_NewAction
      method: doActivityOnDisplayNewConfirm
    transition:
      - event: ProcessCreateNewFromDisplayNewConfirm
        nextState: ProcessCreateNew
      - event: DisplayNewFromDisplayNewConfirm
        nextState: DisplayNew

actionState:

  - name: ProcessValidateNew
    activity:
      class: Entry_NewAction
      method: doActivityOnProcessValidateNew
    transition:
      - event: DisplayNewConfirmFromProcessValidateNew
        nextState: DisplayNewConfirm
      - event: DisplayNewFromProcessValidateNew
        nextState: DisplayNew

  - name: ProcessCreateNew
    activity:
      class: Entry_NewAction
      method: doActivityOnProcessCreateNew
    transition:
      - event: DisplayNewFinishFromProcessCreateNew
        nextState: DisplayNewFinish

(変更後)新規エントリー入力フローのステートチャート図

(変更後)新規エントリー入力フローのステートチャート図

その他にも,HTMLテンプレートに埋め込まれたイベント名の変更,アクションクラスへのイベントハンドラの追加を行う必要があります。

/path/to/pieceblog/web/webapp/templates/Entry/New.html

<h4 class="date-header">NewConfirm</h4>
<p>Title: {entry.title}</p>
<p>Content: {GLOBALS.displayTextArea(entry.content):h}</p>
<form name="NewConfirm" id="NewConfirm">
  <input type="hidden" name="{__flowExecutionTicketKey}" value="{__flowExecutionTicket}" />
  <p>
    <input type="submit" name="{__eventNameKey}_DisplayNewFromDisplayNewConfirm" value="Back" />
    <input type="submit" name="{__eventNameKey}_ProcessCreateNewFromDisplayNewConfirm" value="Create" />
  </p>
</form>

/path/to/pieceblog/web/webapp/actions/Entry/NewAction.php

...
    function doActivityOnDisplayNewConfirm()
    {
        $flexyElement = &new Piece_Unity_Service_FlexyElement();
        $flexyElement->addForm($this->_flow->getView(), $this->_context->getScriptName());

        $viewElement = &$this->_context->getViewElement();
        $viewElement->setElementByRef('entry', $this->_entry);
    }

    function doActivityOnProcessCreateNew()
    {
        return 'DisplayNewFinishFromDisplayNewConfirm';
    }
}
?>

変更が完了したら,ブラウザから動作を確認しておきましょう。

著者プロフィール

久保敦啓(くぼあつひろ)

Piece Frameworkのアーキテクト及びプログラマー。PEARのNet_UserAgent_Mobileの開発者でもある。今春に株式会社アイテマンを設立。

URLhttp://iteman.typepad.jp/