Hatena::Groupcatalyst

masaki@catalyst RSSフィード

Fork me on GitHub
 | 

2007-06-19

Catalyst::Action::RenderViewとviewの切り替え

| 02:30 | Catalyst::Action::RenderViewとviewの切り替え - masaki@catalyst を含むブックマーク はてなブックマーク - Catalyst::Action::RenderViewとviewの切り替え - masaki@catalyst Catalyst::Action::RenderViewとviewの切り替え - masaki@catalyst のブックマークコメント

複数のviewクラスを用意していて,かつviewの処理をRenderViewに任せてる場合の話.

大抵は $c->config->{default_view} に指定したクラスでいいけど,ある特定のパスのときはviewを変えたい場合にどうするか.

RenderViewの一部を抜粋すると

my $view = $c->view();
$c->forward( $view );

ということなので,viewの選択は $c->view依存することになる.で,その実装を見てみると,

  1. 引数がある場合はその名前でviewを探す
  2. $c->stash->{current_view_instance} にviewインスタンスがある場合はそれを使う
  3. $c->stash->{current_view} にviewの名前がある場合は,その名前でviewインスタンスを作る
  4. $c->config->{default_view} がある場合は,その名前でviewインスタンスを作る

という流れになっているので,$c->stash->{current_view_instance} にあらかじめ特定のviewインスタンスを突っ込んでおくと,それが使われることになる.

sub foo : Local {
    my ($self, $c) = @_;
    ...
}

sub bar : Local {
    my ($self, $c) = @_;
    ...
    $c->stash->{current_view_instance} = $c->view('Bar');
}

sub end : ActionClass('RenderView') {}

まぁそもそもアクション内でレンダリングしてしまえばいいんだけど,あえてレンダリングは同じところでやりたいという人向け.

トラックバック - http://catalyst.g.hatena.ne.jp/ikasam_a/20070619
 |