いろんなPHP Webフレームワークで同じ画面を作ってみる (Laiz編)
元ネタはJavaなのでGWTでやろうと思ったけど画面遷移がないのでRPCを使ったとしてもうまく仕様に合わせられない。MVPで途中まで書いたがイマイチに終わり…代わりにPHPで。
仕様はこれ。
http://d.hatena.ne.jp/t1000leaf/20101125/1290612768
- 足し算プログラム
- 計算結果は、別画面に遷移し出力する。
- submit時にリクエストパラメータ名称で処理を切り分けるパターンを検証。
- バリデーションは、必須チェックと整数チェック。
- エラーメッセージは、一括で出力するパターンと、フィールド毎に出力するパターンを試す。
- DBアクセスはないよ。
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
<?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でちゃちゃっと書いた。