変数設定の簡略化
オブジェクトからテンプレート変数を設定できるようにした。
何らかの商品データを表示するページを作る場合、アクションクラスは
<?php class ItemView { public $itemId; public $_laizVoItem; public function execute(DaoFactory $daoFactory){ $itemDao = $daoFactory->factory('item'); $this->_laizVoItem = $itemDao->getVo($this->itemId); } }
このようになる。例えばDBにitem_nameというカラムがあったとしたら、O/Rマッパーで$item->itemNameという変数が用意され、それが今回の変更でテンプレートにも反映されるという仕組み。
これでitemオブジェクトのプロパティ変数名に対応するテンプレート変数が設定される。今まで何故やらなかったかと言うと、少々やりすぎな感じがしたからだ。カラム名がかぶったりnameやidなどというあちこちで使われていそうなDBカラムがあった場合、既存の変数が上書きされてしまう。でもそのことさえ頭にとどめておけば、アクションクラスに書くことが極端に少なくなる。使い捨てのアクションクラスの行数が少ないことは良いことだ、と考えている。
その代わり脳内メモリを多く使ってしまうが・・ますます自分以外は使いにくいものになったような。
上のコードを順に説明すると
- フレームワークによりリクエストパラメータから$itemIdが設定される(index.php?itemId=123 など指定した場合)
- フレームワークによりDaoFactoryオブジェクトがnewされ、execute()引数に渡される
- データベースのテーブル定義ファイルが存在しなければ生成され、itemテーブル用のDaoが生成され返ってくる
- プライマリキーが$itemIdの行を取得してそれがオブジェクトに変換され、それぞれのDB列名に対応したプロパティ変数が設定されて返ってくる
- $_laizVoItemのプロパティ変数が展開され、テンプレートに設定される
ここまで書いて気付いたけど、処理的には無駄な変換をしているな・・。DBからデータを取得するとき、初めから配列で受け取ればそのままビューに渡せるのに。
もっと言えば、ビューでFlexyに渡すときにまたまたオブジェクトに変換している・・。
PHPはあまりにも配列が便利だから全部配列でやってしまおうという考えと、きちんとオブジェクト指向でいこうという考えが混ざってこんなことになったみたいだ。
今はオブジェクトもforeachできるからオブジェクトに統一した方がすっきりいきそうな気がしてきた。オブジェクトって遅くならないのかな?
また本題とは関係ないやることが増えたなぁ・・。