ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

遊んでないよ? というわけでACLの管理画面できた。

ええ、遊んでたわけでは御座いません。計算間違って休職中に現金がそこをつきそうになってマジヤヴァイ((((;゚Д゚)))ガクガクブルブル ということになって、某社でPHPのバイトを始めたためにyakibikiの時間が細切れになり、commitするまで時間がかかるようになった訳です。とりあえず某社の皆様、ありがとう御座いました。飢え死にせずに済みそうです。(TдT) アリガトウ

金勘定できねぇな、自分。

まぁ。

で、相変わらず大いなる山、ACLキャッシュは未実装なのですが、ともあれ、ACLの管理画面が動き出しました。これで、いよいよ・・・ACLキャッシュを実装しないわけにはいかなくなった。

で、それとは別にACLの管理で特に気になった点として。FormBuilderのインスタンスを何度も作ってしまう、という点があった。つまりGuardのonValidateで一回作成、で、pageの中でFormを作成するためにもう一度作成。とかとか。というのも、guardやevent,page間で共通のインスタンスを共有できるようなわかりやすい仕組みをXhwlayは用意していないからだ。まぁ、Xhwlayのアイデアの初期にはDIContainerもどきを作ろうかとも思ったのだけれど、そこまで・・・とか思って実装しなかった。
が、やっぱり無いと・・・guardとpageでそれぞれ作ってしまうし、そのおかげで都度setDefaultしないと行けない。validateの中である程度convertをついででかけてしまっているのがあるため、page内でsetDefaults() -> accept() -> export() する際、export()の中で実はvalidate()を呼んで、validate()をしたときのconvert処理をかけたりというかなり非効率な作りになっている。

singletonにすりゃいいじゃん。

と、今朝思いついた。やはり、アイデアがいろいろ湧くのは起床直後だ。というわけで、ちょっとFormBuilderをSingletonにしてみる。newをprivate扱いにして。PHPならでは。JavaだったらThreadオブジェクトと紐づけたfactoryになるのかな・・・。

ちなみに、HTML_QuickFormは使いません。定型フォームの大量生産、というほどでも無いので。というか添付するPEARが重くなるので(ノ´∀`*)。
むしろ今回は、DAO/TXレベルのデータ表現と、UI(入力フォーム)との間の相互変換としてFormBuilderを位置づけ、基本的に以下のメソッドを提供するようにしています。

  • setDefaults(dao/txレベルのデータレコード) : デフォルト値の設定
  • accept('POST'/'GET') : リクエストデータを内部にセット。
  • validate() : リクエスト値の妥当性チェック
  • export() : 内部表現をdao/tx向けのデータレコードに変換
  • build() : 入力フォームの形で個々のフォームのHTMLコードの配列セットを返す。
  • freeze() : 確認画面用の静的HTMLコードの配列セットを返す。

使い方をものすごいおおざっぱに書いてみるとこんな感じ。

$data = $dao->find_by_id($id);
$form =& new yb_mdl_XXXX_FormBuilder
// or
// $form =& yb_mdl_XXXX_FormBuilder::singleton();
$form->setDefaults($data);

// リクエスト情報を受信
$form->accept('post');
if ($form->validate()) {
    $new_data = $form->export();
    $dao->update($id, $new_data);
    $htmls = $form->freeze();
} else {
    $htmls = $form->build();
}

$renderer->set('form_htmls', $htmls);

で、入力フォームを提供するモジュール毎にFormBuilderを実装するわけですが、特にinterfaceに相当するクラスは用意しませんでした。それほどでも、ですし。で、特に内部実装に関する共通化も考慮しませんでした。まぁ、大量生産というわけでも無いので。
そんな感じです。