Viewクラス
※まだ、メソッド呼び分けの件が決着してないのに次の問題提起・・・
Maple3ではMojaviとかとちがってActionクラスに対するViewクラスをつくらない。以前書いたけど、社内でつかっているMaple2まではViewクラスをつくっていた。けど、いろいろしていくと必要がないように感じたのでなくした。その結果、Viewフィルターでえぐいことをすることになった。これまた以前id:hawkringさんに指摘されている。Viewフィルターでaction/errorList/tokenを特別扱いしてSmartyに登録してるのだ。逆にこれ以外のクラスはActionを通してでないとSmartyにわたせない。
けど、今考えるとこんなことする必要ないんでないか?みんなDIContainerにはいってるんだから、以下のような形で引っ張ってこれるようにSmartyファンクションをつくっちゃえばいいんじゃないか?(target部分はELやOGNLみたいな感じ)
{container target="errorList.messages"}
「container」というのがとっつきにくいかな・・・(いい名前があればお願いします)
Actionでは引数を直接自らの変数にうけとるんではなくて、DTOとしてうけとる。例えばこんな感じ。
class Foo { var $dto; function setDto(&$dto) { $this->dto =& $dto; } : }
maple.iniはこんな感じ。(一部抜粋です。dicon.iniは今回省略)
[DIContainer] filename = dicon.ini [InjectRequest] dto = [Action] dto = ref:dto
こうやれば、DIContainerのなかに「dto」という名前ではいってるので、Smartyファンクションができれば、以下のように呼べることになる。(もちろん、このDTOにリクエストパラメータをインジェクションするだけではなくて、ロジックの結果もいれる)
名前: {container target="dto.name"}<br> 処理結果: {container target="dto.result"}
targetの部分の書式のバリエーションを増やしていけば、「処理したactionの値をとる」ってので「action.name」とかとかけるようにできるかも。
かなりViewフィルターのえぐさは減るんではないでしょうかね。私のイメージはあくまでもテンプレート側から値をとってもらうというイメージなのでこうなります。スクリプト側からテンプレートに値をセットするというイメージを崩したいというのが当初の狙いだったし。このあたりに違和感をおぼえられるかたがまたでそうだな・・・
よりいい案があるぞーとかそんなのでは解決になってない!という方、意見ください。