Remoraを眺めてみた2

Remoraを眺めてみた感想メモその2。

實松アウトプット: Remoraを眺めてみた1
http://sane.justblog.jp/blog/2008/02/remora1-e01b.html

Revision 10695: /addons/trunk/site
http://svn.mozilla.org/addons/trunk/site/

全部要る時だけbindFully

$hasMany_full,$hasAndBelongsToMany_full,$belongsTo_full
を書いておいてフル必要なときにbindFully()でバインドするっていうのはいいね。

bindModelかSQLか

条件つけたり取り出す順番だったりってのは前に書いたようにbindModelで出来る。
でもRemoraはモデルに直にSQLで書いちゃってる。まあわかりにくいもんなあ。SQLで書いちゃったほうがミスも少ないし速い(速い人は速いしそういう人が多いはず)。ただ私の場合SQL書くにもドキュメント見ながらだし、arrayで書くのとあんまり変わらない。bindModelならデータベースの差異を吸収できる(はず)っていうのはあるけど。ひょっとすると速度的な問題もあるのかな。remoraはどこみてもMySQL専で書かれているし。

bindModelの上手な使い方

addons_controllerのversionsメソッド一部抜粋

$bindusers = array('hasAndBelongsToMany' => array('User' => $this->Addon->hasAndBelongsToMany['User']));
$this->Addon->unbindFully();
$this->Addon->bindModel($bindusers);
$addon = $this->Addon->findById($id, null, null, null, null, 0);

なるほどなるほどー。一番勉強になったのはここ。このbindModelの書き方はかっこいい。そうかこれならすっきりだ。

なんだかんだで結構fatなコントローラ

基本的にSQLのクエリのべた書きが必要なもの以外はコントローラで済ませちゃってる。いくつかコントローラにSQLべた書きしているところもある。かなり効率的に分かりやすく書かれているけど、なんだかんだで結構fatなコントローラだ。getActiveUserByMail($mail)とか作ってちょっとずつ条件の違うメソッドでモデルが埋め尽くされるのとどっちがましなんだろう。これは一見thinに見えるけど結局いちいちモデル確認しなきゃいけないんだよね。あ、でも全部丸ごとモデルに押し込んじゃうとアソシエーションを設定するためにはあらかじめアソシエーションが無いと直には読めないのか。でもやっぱりコントローラ経由すれば読めるのか。やっぱりappimportしちゃえばいいのか。どっちがマシかはまだよくわからない。

まだ続くかも。そのうち。

広告

Remoraを眺めてみた1

Remoraを「読んでみた」ではなく「眺めてみた」です。感想メモその1。
Revision 10695: /addons/trunk/site
http://svn.mozilla.org/addons/trunk/site/

MVC間のデータ移動はざっくり

コントローラではモデルから受け取ったデータをざっくりビューに押し込んでいる。
サニタイズをapp_controllerでビューにセットする直前にやってる。$this->publish()ってやつ。それはビューでやりたい気も。

ビューはやっぱりモデル名やカラム名で溢れる

ビューが一見あんまりモデル名やカラム名で溢れてないって書いたけれど、前言撤回。

たとえばapp/views/addons/display.thtmlなんかそんなのでいっぱい。foreachの中で$addon[‘Version’][0][‘File’][0][‘id’]こんなのとか。てことは渡されてるデータは$addons[0][‘Version’][0][‘File’][0][‘id’]みたいなのか。うげげ。

ビューの共通ロジックもコンポーネントに

コントローラごとに違う処理の場合コントローラが持っているけれど、コントローラまたいで共通のロジックの場合、コンポーネントにしてあってビューからロジックを呼び出している。

app/views/addons/recommended.thtmlだと

$prevPath = $this->controller->Image->urlForAddonPreview($addon[‘Addon’][‘id’], 1);

こんな感じ。
こういうのってたいていヘルパー使うと思うんだけどなんでなんだろう。
Imageコンポーネントの中身見てみるとモデルにアクセスしてるメソッドがあった。findByIdとか。ああだからこの辺の機能まとめてコンポーネント(コントローラ)なんだ。納得した。
あとコンポーネントのstartupで$this->controller =& $controller;ってしておけばコンポーネントからモデルにアクセスするのも簡単なのね。でもappimport(Model, Hoge)でモデル入れといてnew Hoge()した方が分かりやすいしアクセスしやすい気がしないでもない。このへんはあらかじめ規約で決めとくのかな。そっかこれならコンポーネントでコントローラのメソッドが使えるんだ。redirectとかflashとか。

真似してやってみたけれどviewからだと$this->controller->Componentでアクセスできない。何か設定が足りないかな。ビューがコントローラのオブジェクト持ってないからか。というわけでFAQを参考にコンポーネントのスタートアップでコンポーネント自身をビューに渡して、ビューからコンポーネントに$componentでアクセスできるやり方にしてみた。

どうでもいいけど眺めてたデータは五日前のRevision 10565なのに今はもうRevision 10695になってる。更新してみたら30個以上ログがあった。

続きはそのうち。