Hatena::Groupcatalyst

masaki@catalyst RSSフィード

Fork me on GitHub
 | 

2008-06-24

Catalyst::View::Templated を使う前に

| 03:20 | Catalyst::View::Templated を使う前に - masaki@catalyst を含むブックマーク はてなブックマーク - Catalyst::View::Templated を使う前に - masaki@catalyst Catalyst::View::Templated を使う前に - masaki@catalyst のブックマークコメント

Catalyst::View::Templated とは

=head1 NAME

Catalyst::View::Templated - generic base class for template-based views

にもあるように,テンプレートベースな View のための基本クラスになるもの.

また Catalyst::Component::ACCEPT_CONTEXT を継承しているので,$view->context として $c を使うことができる.そのため後段のメソッドには $c を引数として渡さなくてよい作りになっている.

基本的に,古き強力な View である Catalyst::View::TT に対応する作り(置き換え可能)になっているので,比較して見ていくとわかりやすいかもしれない.

メソッド

従来の View は基本的に new, render, process の 3 つを実装している.Catalyst::View::TT を見ると,render はテンプレートでレンダリングした結果を返すメソッドになっていて,process はその結果を $c->res->body に入れつつ必要なら $c->res->content_type なども設定するような役割になっている.

Catalyst::View::Templated では new, render, process に加え template というテンプレートファイルの getter/setter メソッドが存在する.ちなみにこの template メソッドで実際のテンプレートファイルを特定する順番は

1. $self->context->stash->{$self->_ident()};
2. $self->context->stash->{template};
3. $self->context->action . ($self->{TEMPLATE_EXTENSION} || q{});

という実装になっていて,一応説明すると

  1. まず $c->stash のユニーク(と思われる)な文字列キーから取得
  2. だめなら Catalyst::View::TT 由来の $c->stash->{template} を見る
  3. それでも無ければ同じく従来の $c->action . TEMPLATE_EXTENSION によりアクション名から自動決定する

ということである.

2./3. は Catalyst::View::TT との互換性を考慮したものであるが,1. は他の View と重複しないキーを stash に持つ方法になっているので,グローバルに stash を汚染しなくてすむというメリットがある.

なお,$c を $self->context で代用しているため,$c をメソッドに直接の渡す必要がまったく無くなっているのは前段の通り.

設定

Catalyst::View::Templated にとって意味のある config は

  1. CATALYST_VAR
  2. CONTENT_TYPE
  3. INCLUDE_PATH
  4. TEMPLATE_EXTENSION

の 4 つである.

このうち 1., 3., 4. は Catalyst::View::TT でもおなじみのオプションで,使われ方も大体同じである.一つ新しいオプションの CONTENT_TYPE は,process で $self->context->res->content_type を設定するときに使われる値になる.

現在の Catalyst::View::Templated は VERSION 0.02 だが,一つ注意したいのが,このバージョンでは View の config() に直接設定を書いても反映されないということである.

例えば

MyApp->config(
    'View::SomeEngine' => {
        TEMPLATE_EXTENSION => '.tmpl',
        CATALYST_VAR       => 'c',
        INCLUDE_PATH       => ['root', 'root/my_theme'],
        CONTENT_TYPE       => 'application/xhtml+xml',
    },
);

これは反映されるが,以下の書き方ではまったく無視されて Catalyst::View::Templated のデフォルト値が使われる.

package MyApp::View::SomeEngine;
use parent 'Catalyst::View::Templated';

__PACKAGE__->config(
    CATALYST_VAR       => 'c',
    CONTENT_TYPE       => 'application/xhtml+xml',
    INCLUDE_PATH       => [ 'root', 'root/my_theme' ],
    TEMPLATE_EXTENSION => '.tmpl',
);

この件に関しては,現在 jrockway にパッチを送っているが,反映されるかどうかは知らない.

ちなみにデフォルト値は以下の通り.

CATALYST_VAR => 'c',
CONTENT_TYPE => 'text/html',
INCLUDE_PATH => [ MyApp->path_to('root') ],

Catalyst::View::Templated の実装 - masaki@catalyst - Catalystグループ に続く.

MichealMicheal2011/12/28 05:22Please keep thoriwng these posts up they help tons.

kuirvefkuirvef2011/12/28 19:36ATtP34 <a href="http://fjuusxyvlbpg.com/">fjuusxyvlbpg</a>

btbdnqyqqmbtbdnqyqqm2011/12/29 01:064Yak6x , [url=http://bnejoltpjjpw.com/]bnejoltpjjpw[/url], [link=http://lxeivqypczcj.com/]lxeivqypczcj[/link], http://gzohanxiuopc.com/

wlkjfiuwlkjfiu2011/12/30 23:25fCh7Fz <a href="http://oxyeffbuquou.com/">oxyeffbuquou</a>

akaulnwizakaulnwiz2011/12/31 03:17P3ggR5 , [url=http://zmaieedlwqys.com/]zmaieedlwqys[/url], [link=http://rmctwxqmqjee.com/]rmctwxqmqjee[/link], http://bgyncaqbvxic.com/

 |