<?php echo "Hello PHP"; ?>

PHPとJava中心のウェブ技術うんちくブログ

2007年06月

JavaとDTOとVOとPHPフレームワーク

Java の仕事では当たり前のように使っている DTO (DataTransferObject)、現場によっては VO (ValueObject)とも呼ばれていますが(個人的にはDTOが好き)、現在作成中の PHP フレームワークでもこのオブジェクトの利用を推奨しています。どの辺がこれらのオブジェクト(DTO)に対応しているのかと言うと、画面からのデータ(リクエストパラメータ)を受け取るところでフレームワークが DTO の該当するプロパティに直接データをセットしてくれます。

Java のプロジェクトでよくリクエストパラメータを一つずつ DTO のプロパティにセットし直したりしているのを見ますがこのフレームワークではそんな面倒な作業をする必要はありません。例えばユーザの名前を入力するためのテキストボックスがあるならば name 属性に userDto::name と記述しておけばフォームで定義してあるUserDto型オブジェクトの name プロパティに入力値がセットされて渡されます。

そんなフレームワークですが現在公式サイトを作成しています。完成次第このブログでも紹介しますので是非いらしてください。


PHPフレームワーク 〜 設定ファイル フォーム編2 〜

今回は実際のソースを使ってフォームクラスを説明しようと思います。

フォームクラス (UpdateForm.php)

class UpdateForm extends BeanForm
{
    /**
     * フォームを初期化します
     *
     * @return array
     */

    public function init()
    {
        return array(

            "id"     => 0,
            "title"  => null,
            "author" => null,
            "isbn"   => null
        );
    }


    /**
     * バリデートチェック
     *
     * @param HttpRequest $request
     * @return string
     */

    public function validate($request)
    {
        if (
$this->getTitle() == "") {
            $this->addMessage("error.empty_title");
            return "error.tpl";
        }
    }
}



このフレームワークのフォームクラスはこんな感じになります。画面からのデータのチェック処理はフォームのvalidate()で行えます。

通常フォームと言うとプロパティのセッター・ゲッターを長々と書くことになりますがこのフレームワークではBeanFormクラスを継承したサブクラスにすると上記のようにセッター・ゲッターを書いていなくてもセッター・ゲッターが使えます。プロパティはinit()の連想配列でセットします。連想配列のキーがプロパティ名で値がプロパティの設定値(初期値)になります。フレームワークはフォーム作成後にこのinit()をコールしてプロパティを初期化します。


メッセージリソース (messages.conf)

error.empty_title = タイトルは必須項目です。


上記のようなフォームクラスとメッセージリソースを用意すると、画面からのid、title、author、isbnという名前でリクエストパラメータを取得できさらにアクションが呼ばれる前にパラメータtitleの入力チェックを行うことができます。ここでエラーが無ければアクションクラスに処理が移りますがエラーがあった場合は指定している error.tpl テンプレートに「タイトルは必須項目です。」というメッセージを表示して処理が終わります。エラーで遷移する画面はreturnで返す値をパターン分けすればどこにでも飛ばせます。

Ajaxでいこう

お仕事の話しですが前々回のJavaの業務アプリが入力項目の多い画面がたくさんあるプロジェクトで、プルダウンで入力項目が変化していく、Webアプリだとちょっとやりたくない大変なものでした。最初の一画面はプルダウンのonChangeでsubmitさせて項目を変えていく普通のやり方でコーディングしていましたが、プルダウンを選択するたびに画面の再表示が行われてユーザビリティの悪い画面になってしまいました。

まあ想定されていた動きでしたが実際使う側まわるともうちょっと何とかーと。そこで今度は非同期通信を使って二画面目にチャレンジ。以前からJavaScriptはそれなりに使っていたので時間もかからず実装が終わり、画面の出来栄えもなかなか。もっと早く取り入れていれば良かった、というのが印象でした。

そんなこんなで今回作っているPHPのフレームワークではこの辺の仕組みも取り入れようと思っています。とは言ってもprototype.jsさえあれば(無くてもそれほど面倒な気はしませんが)フレームワークに仕組みがなくてもいけるのかなとも思ってます。

フレームワークにAjax対応と銘打つには何があればいいんでしょうかね。

PHPフレームワーク 〜 設定ファイル フォーム編 〜

設定ファイルの続き。

設定ファイル (webfront.conf)

[action-mapping]
/new = /src/action/CreateAction
/update = /src/action/UpdateAction
/delete = /src/action/UpdateAction::delete
/welcome = /src/pages/welcome.tpl
/read = /src/action/ReadAction#command

[form-mapping]
/new = /src/form/CreateForm
/update = /src/form/UpdateForm
/delete = /src/form/UpdateForm

[filter-mapping]
/* = CFilter
/update = AFilter, BFilter

[filter]
AFilter = /src/filter/AFilter
BFilter = /src/filter/BFilter
CFilter = /src/filter/CFilter



前回まではアクションの設定でしたが今回はフォームの設定です。

このフレームワークもStrutsと同じように画面ごとにフォームを用意し、データをフォームクラスに保持することが可能です。設定次第では画面ごとではなく複数の画面で一つのフォームを使い回ししたり、フォームを一切使わない画面という設定も可能になっています。簡単な画面などはフォームを使わないのも手でしょう。フォームの設定は[form-mapping]に記述します。 記述の仕方は簡単でアクションパス = フォームのクラスパス、という感じになります。これはアクションの記述の仕方と同じです。

上記の設定ファイルだと、/new に対してはCreateFormクラスをフォームのクラス、/update にはUpdateFormクラス、/delete にはUpdateFormクラスということになります。ここでカンのいい方は気付いたと思いますがフォームは複数のアクションパスで同一のフォームを記述することができます。/update と /delete は同じUpdateFormクラスをフォームとして使うということです。

また[action-mapping]でアクションパス /read を定義していますが、[form-mapping]では /read を定義していません。この場合アクションにReadActionクラス、フォームは無し、という設定になります。この設定も有りです。この設定だとアクションクラス内のフォーム変数の値はnullとなり、リクエストパラメータを取得する場合はHttpRequestオブジェクトのget()を使って取得することになります。


アクションクラス (ReadAction.php)

class ReadAction extends DispatchAction
{
    /**
     * ボタンとアクションをマッピングする
     *
     * @return array
     */

    protected function getKeyMethodMap()
    {
        return array(

            "button.list" => "list",
            "button.back" => "back"
        );
    }


    /**
     * 一覧表示ボタンのアクション
     *
     * @param HttpRequest $request
     * @param Form $form
     * @return string
     */

    public function list($request, $form)
    {

        // リクエストパラメータの値を取得
        // このメソッドの引数$formはnullです
        $name = $request->get("name");

        // 通常は下記のようにフォームから取得します
        //$name = $form->getName();

        return "read.tpl"
;
    }

    /**
     * 戻るボタンのアクション
     *
     * @param HttpRequest $request
     * @param Form $form
     * @return string
     */

    public function back($request, $form)
    {

        // 戻る処理

        return "read.tpl"
;
    }
}



フォームクラスはこの他にバリデートチェックをするメソッドもありますがこれはまた次回に紹介します。一連の設定の説明が紹介しきれた時にこのフレームワークをダウンロードできるようにしたいと思いますので是非使って頂いて感想等をお聞かせ頂ければと思っています。
最新記事
Archives