今回は前回に引き続いてアプリケーションへのデータアクセスの組み込みを行っていきます。
データアクセスコード配置先の検討とフローの変更-エントリー一覧フロー
前回は新規エントリー入力フローに対するデータアクセスコードの実装を行いました。新規エントリー入力フローで新規エントリーを作成するとエントリー一覧画面に遷移しますが,エントリー一覧画面で表示される内容はモックオブジェクトのものであり本物ではありません。そこで次はエントリー一覧フローにデータアクセスコードを組み込み,実際のレコードからエントリーの一覧が作成されるようにします。まずは新規エントリー入力フローと同様に,コードの配置先について検討してみます。
前回書いたように,筆者はビュー関連以外のコードをアクションステートのアクティビティ(ステート更新時のイベントハンドラに対応)に配置することを推奨していますので,今回もそれに従って新規にアクションステートを用意し,そのステートのアクティビティにデータアクセスコードを配置することにします。
では,下記のようにフロー定義ファイルを変更しましょう。
/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)

