モデル分離したはいいけど$c->model('DBIC::User')はどー使おう

モデルをAPIに分離したら、$c->model('API::User')は当然CRUDなんて出来るわけ無いから、コントローラかAPIDBICが使えるオブジェクトを作ってやらんといけない。

  • コントローラ側で作る場合
$c->model('API::User')->method( $c->model('DBIC::User') );
  • API側で作る場合
# どっからかスキーマを拾ってくる
my $u = $schema->resultset('User');

これ、割と面倒。コントローラとAPIどっちかで毎回これやるの?


あと例えば、 /user/5 でidが5のデータを引っ張ってくるようなとき、

  • コントローラ
$c->model('API::User')->get_user_data( $c->model('DBIC::User'), $user_id );
sub get_user_data {
    my ($self, $rs, $user_id) = @_;
    $rs->search_rs({id => $user_id})->next;
}

とか書くくらいならコントローラで $c->model('DBIC::User')->search_rs するわいって思うんですよ。
コントローラにこの程度のロジック書くのも駄目か?
むしろstashとかsessionとかどーしよ。


$c->model('API::User') にDBICメソッド生えてればいんじゃね?と思って、searchとかのラップを書いたベースクラスを作って全APIがそれ継承すればいいじゃんって思ったけど分かんなくて終了。
pixisがこうやってたのは知ってるけどソースが奥深すぎて読めてない。
no strict 'refs'して名前空間侵して全APIにsearchとかのメソッド生やしたらCatalyst::Model::MultiAdaptor::LifeCycleが「API::Userにnewメソッドが無いよ」って言って死んだ。アルヨー


ひとまず簡単なCRUDはコントローラで済ます、そうでないのはAPIでrs作ってそっちで済ます、って感じに逃げた。のだけど。
どーしたらスマートになるかな?