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

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

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

今回は前回に引き続いてアプリケーションへのデータアクセスの組み込みを行っていきます。

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

前回は新規エントリー入力フローに対するデータアクセスコードの実装を行いました。新規エントリー入力フローで新規エントリーを作成するとエントリー一覧画面に遷移しますが,エントリー一覧画面で表示される内容はモックオブジェクトのものであり本物ではありません。そこで次はエントリー一覧フローにデータアクセスコードを組み込み,実際のレコードからエントリーの一覧が作成されるようにします。まずは新規エントリー入力フローと同様に,コードの配置先について検討してみます。

前回書いたように,筆者はビュー関連以外のコードをアクションステートのアクティビティ(ステート更新時のイベントハンドラに対応)に配置することを推奨していますので,今回もそれに従って新規にアクションステートを用意し,そのステートのアクティビティにデータアクセスコードを配置することにします。

では,下記のようにフロー定義ファイルを変更しましょう。

/path/to/pieceblog/web/webapp/config/flows/Entry/List.yaml

firstState: ProcessFindList

viewState:

  - name: DisplayList
    view: List
    activity:
      class: Entry_ListAction
      method: doActivityOnDisplayList

actionState:

  - name: ProcessFindList
    activity:
      class: Entry_ListAction
      method: doActivityOnProcessFindList
    transition:
      - event: DisplayListFromProcessFindList
        nextState: DisplayList

データアクセスコードの実装-エントリー一覧フロー

次にアクションクラスにイベントハンドラを追加し,データアクセスコードを記述します。ここでは単にentryテーブルの全レコードを取得するために$mapper->findAll()を使うことにします。また,モックオブジェクトの設定コードが不要になったためコンストラクタを削除しておきます。

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

<?php
require_once 'Piece/Unity/Service/FlowAction.php';
require_once 'Piece/Unity/Service/FlexyElement.php';
require_once 'Piece/ORM.php';

class Entry_ListAction extends Piece_Unity_Service_FlowAction
{
    var $_entries;

    function doActivityOnDisplayList()
    {
        $viewElement = &$this->_context->getViewElement();
        $viewElement->setElementByRef('entries', $this->_entries);
    }

    function doActivityOnProcessFindList()
    {
        $mapper = &Piece_ORM::getMapper('Entry');
        $this->_entries = $mapper->findAll();

        return 'DisplayListFromProcessFindList';
    }
}
?>

作業が完了したら,ブラウザから動作を確認してください。エラーが発生せずにデータベースの内容が反映されたエントリー一覧画面が表示されたら成功です。また,新規エントリー入力フローからエントリーを追加してみましょう。きちんと新しいレコードが画面に反映されるはずです。また,直接データベースにアクセスし,表示されているレコードがデータベース由来のものか確認しておきましょう。

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

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

エントリー一覧画面

エントリー一覧画面

pgbashによるレコードの確認

$ select * from entry;
 id | title     | content
----+-----------+---------
  1 | タイトル1 | 内容1\r
  2 | タイトル2 | 内容2\r
  3 | タイトル3 | 内容3\r
(3 rows)

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

これまでに新規エントリー入力フローとエントリー一覧フローの実装が完了しましたので残るはエントリー編集フローのみとなります。このフローは他のフローと比べると少々複雑ですので少しずつ実装を進めていくことにします。まずは現状のフロー定義を確認しましょう。

/path/to/pieceblog/web/webapp/config/flows/Entry/Edit.yaml

firstState: DisplayShow

lastState:
  name: DisplayDeleteFinish
  view: http://example.org/list.php

viewState:

  - name: DisplayShow
    view: Show
    activity:
      class: Entry_EditAction
      method: doActivityOnDisplayShow
    transition:
      - event: DisplayEditFromDisplayShow
        nextState: DisplayEdit
      - event: DisplayDeleteConfirmViaDisplayShowFromDisplayShow
        nextState: DisplayDeleteConfirmViaDisplayShow

  - name: DisplayEdit
    view: Edit
    activity:
      class: Entry_EditAction
      method: doActivityOnDisplayEdit
    transition:
      - event: ProcessValidateEditFromDisplayEdit
        nextState: ProcessValidateEdit
      - event: DisplayDeleteConfirmViaDisplayEditFromDisplayEdit
        nextState: DisplayDeleteConfirmViaDisplayEdit

  - name: DisplayEditConfirm
    view: EditConfirm
    activity:
      class: Entry_EditAction
      method: doActivityOnDisplayEditConfirm
    transition:
      - event: DisplayShowFromDisplayEditConfirm
        nextState: DisplayShow
      - event: DisplayEditFromDisplayEditConfirm
        nextState: DisplayEdit

  - name: DisplayDeleteConfirmViaDisplayShow
    view: DeleteConfirmViaDisplayShow
    activity:
      class: Entry_EditAction
      method: doActivityOnDisplayDeleteConfirmViaDisplayShow
    transition:
      - event: DisplayDeleteFinishFromDisplayDeleteConfirmViaDisplayShow
        nextState: DisplayDeleteFinish
      - event: DisplayShowFromDisplayDeleteConfirmViaDisplayShow
        nextState: DisplayShow

  - name: DisplayDeleteConfirmViaDisplayEdit
    view: DeleteConfirmViaDisplayEdit
    activity:
      class: Entry_EditAction
      method: doActivityOnDisplayDeleteConfirmViaDisplayEdit
    transition:
      - event: DisplayDeleteFinishFromDisplayDeleteConfirmViaDisplayEdit
        nextState: DisplayDeleteFinish
      - event: DisplayEditFromDisplayDeleteConfirmViaDisplayEdit
        nextState: DisplayEdit

actionState:

  - name: ProcessValidateEdit
    activity:
      class: Entry_EditAction
      method: doActivityOnProcessValidateEdit
    transition:
      - event: DisplayEditConfirmFromProcessValidateEdit
        nextState: DisplayEditConfirm
      - event: DisplayEditFromProcessValidateEdit
        nextState: DisplayEdit

エントリー編集フローのステートチャート図

エントリー編集フローのステートチャート図

このフローのうちデータアクセスが必要な部分は下記のようになります。

  • フロー実行開始直後のエントリー参照画面表示前(SELECT)
  • エントリー編集確認画面のUpdateボタンがクリックされた後(UPDATE)
  • 各エントリー削除確認画面のDeleteボタンがクリックされた後(DELETE)

著者プロフィール

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

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

URLhttp://iteman.typepad.jp/

コメント

コメントの記入