ログ日記

作業ログと日記とメモ

いろんなPHP Webフレームワークで同じ画面を作ってみる (Laiz編)

元ネタはJavaなのでGWTでやろうと思ったけど画面遷移がないのでRPCを使ったとしてもうまく仕様に合わせられない。MVPで途中まで書いたがイマイチに終わり…代わりにPHPで。


仕様はこれ。

  • 足し算プログラム
  • 計算結果は、別画面に遷移し出力する。
  • submit時にリクエストパラメータ名称で処理を切り分けるパターンを検証。
  • バリデーションは、必須チェックと整数チェック。
  • エラーメッセージは、一括で出力するパターンと、フィールド毎に出力するパターンを試す。
  • DBアクセスはないよ。
http://d.hatena.ne.jp/t1000leaf/20101125/1290612768


PHP編は http://d.hatena.ne.jp/thatblue/20101202/1291310460 ここ。



下準備。

mkdir add; cd add
git clone git://github.com/nishimura/laiz.git
mkdir -p app/Base/Action app/Base/templates compiled htdocs
chmod o+w compiled


エントリーファイル。
htdocs/index.php

<?php
require_once '../laiz/Laiz.php';
Laiz::laze();


converterは別に要らないんだけど、フォームの入力値が複数ある場合はオブジェクトにした方が扱いやすいので変換。
app/Base/Action/Top.ini

[property]
arg =

[converter]
arg = arrayToObject,Base_Arg

propertyはエラーの場合のデフォルト値設定用。


app/Base/Arg.php

<?php
class Base_Arg
{
    public $arg1;
    public $arg2;
}

ついでに加算器。
app/Base/Adder.php

<?php
class Base_Adder
{
    public function add(Base_Arg $arg)
    {
        return $arg->arg1 + $arg->arg2;
    }
}


次にアクションクラス。
入力フォームのアクションクラスは無し。
結果ページのアクションクラスは、リクエストパラメーターをオブジェクトで受け取って加算器クラスで計算する。
app/Base/Action/Result.php

<?php
class Base_Action_Result
{
    public $arg;
    public $result;
    public function act(Base_Adder $adder)
    {
        $this->result = $adder->add($this->arg);
    }
}

Base_Adderはコンテナが自動で生成する。


バリデーションの全体設定。
app/Base/Action/Result.ini

[validator]
errorMessage    = "エラーがあります"
errorMessageKey = error
errorAction     = Top
file            = Base/validator.ini

[converter]
arg = arrayToObject,Base_Arg

バリデーションの変数ごとの設定。
app/Base/validator.ini

[arg.arg1]
required = "arg1 空欄エラー"
digit    = "arg1 数値エラー"

[arg.arg2]
required = "arg2 空欄エラー"
digit    = "arg2 数値エラー"


あとはHTML。
app/Base/templates/Top.html

<html>
<head>
  <title>input</title>
</head>
<body>
  <div style="color:red">
  {error}<br>
  {errorArgArg1}<br>
  {errorArgArg2}
  </div>
  <form action="Result">
  arg1: <input name="arg[arg1]" type="text" value="{arg.arg1}"/><br/>
  arg2: <input name="arg[arg2]" type="text" value="{arg.arg2}"/><br/>
  <input type="submit" />
  </form>
</body>
</html>

エラーメッセージの変数名はキャメルケース的な感じで。


app/Base/templates/Result.html

<html>
<head>
  <title>result</title>
</head>
<body>
  result: {result}
</body>
</html>


最近Javaばっかりやっているけれど、こういう軽いページだとPHPは楽で良いと改めて思う。リモートからcatとviでちゃちゃっと書いた。