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

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

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

データアクセスコードの実装─新規エントリー入力フロー

では,データアクセスコードの実装を行います。具体的な作業は,アクションクラスへのデータアクセスコードの実装,マッパー定義ファイルの作成,Piece_ORM設定ファイルの作成の3つになります。下記はデータアクセスコードの実装です。

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

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

class Entry_NewAction extends Piece_Unity_Service_FlowAction
{
    var $_entry;

    function Entry_NewAction()
    {
        $this->_entry = &Piece_ORM::createObject('Entry');
    }
...
    function doActivityOnProcessCreateNew()
    {
        $mapper = &Piece_ORM::getMapper('Entry');
        $mapper->insert($this->_entry);

        return 'DisplayNewFinishFromDisplayNewConfirm';
    }
}
?>

最初にコンストラクタのstdClassのインスタンスを生成していた部分がPiece_ORM::createObject('Entry')で置換されていますが,返されるオブジェクトは依然としてstdClassのインスタンスであることに注意してください。元のコードとの違いは,Piece_ORM::createObject()によってあらかじめテーブルのフィールドに対応したプロパティが用意されていることだけです。

イベントハンドラには実際のデータアクセスコードが記述されています。Piece_ORM::getMapper()は引数に与えられたマッパー名に対応するマッパーオブジェクトを返します。$mapper->insert()は,引数に与えられたオブジェクトを新規レコードとしてマッパーに対応するテーブルに追加します。

マッパー名はテーブル名に対応しており,マッパーのコンテキストではテーブル名はキャメルケースで取り扱われます。名称の先頭は大文字に変換されます。また,⁠_⁠(アンダースコア)は削除され,⁠_⁠(アンダースコア)の直後の文字が大文字に変換されます。今回の場合,対象テーブル名はentryなのでマッパー名はEntryになります。

現在のところ,Piece_ORMはメタデータに基づいたマッパーオブジェクト生成を行いません。言い換えると,対象テーブルが存在することによってマッパーが有効になるわけではありません。そのため,Entryマッパーを有効にするには,マッパー定義ファイルEntry.yamlを準備する必要があります。マッパー定義ファイルの最も重要な用途は対象テーブルのマッパーを有効にすることです。その他の用途としては,任意のメソッド名とSQLのマッピング,SQLのオーバーライト,メソッドに対するリレーションシップの設定などがあります。対象テーブルのマッパーを有効にする用途のみに使用する場合は,単に空のファイルを用意します。よって今回の場合,空のファイル/path/to/pieceblog/web/webapp/config/orm/mappers/Entry.yamlを作成することになります。

最後の作業は,データベースへの接続情報をPiece_ORM設定ファイルに定義することです。

/path/to/pieceblog/web/webapp/config/orm/piece-orm-config.yaml

- name: pieceblog
  dsn: pgsql://pieceblog:pieceblog@localhost/pieceblog

作業が完了したら,ブラウザから動作を確認してください。エラーが発生せずにエントリー一覧画面が表示されたら成功です。現段階ではエントリー一覧画面には本物のレコードは反映されないため,直接データベースにアクセスし,レコードが追加されているかどうかを確認しましょう。

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

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

pgbashによるレコード追加の確認

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

(1 row)

おわりに

今回はデータベース設計とテーブル定義,各種環境設定を行ったあと新規エントリー入力フローにデータアクセスコードを組み込みました。

上記のようにPiece_ORMによるデータアクセスコードは非常に簡潔なものになります。一般的にアクションクラスへのデータアクセスコードの配置は推奨されていませんが,上記のような簡潔なコードを別のクラスに配置することに意味があるとは思えません。筆者はPiece_ORMを使ったデータアクセスコードはむしろイベントハンドラに記述することを推奨しています。とはいえ,イベントハンドラやアクションクラスが複雑になったときは,他のクラス同様メソッド抽出やクラス抽出によるリファクタリングを行ってください。

次回は残りの2つのフローにデータアクセスコードを組み込み,アプリケーション全体がデータベースを使った形で動作するようにします。

著者プロフィール

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

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

URLhttp://iteman.typepad.jp/