ひげぽん OSとか作っちゃうかMona- - Catalyst入門 と お作法について

templateの include

rootからのパスを指定してやればよい

[% include templates/user/username.tt %]
はてなのひげぽんさんがCatalystについて書いていたのでそれを受けて書いてみます。上記のこれは、root/base/の中に読み込みたいincludeファイルを入れてやると、それがTTのINCLIDE_PATHに入っているので [% include username.tt %]で読み込めるようになります。Catalyst::View::TTの103行目付近にその記述があります。ちなみに、テンプレートの中にデフォルトで使えるようになってる変数はbase($c->req->base), c($c), name($c->config->{name})の3つのようですね。なので自分はProject.pmのsub end {}で、$c->stash->{session} = $c->sessionとやって、セッションをテンプレートで[% session.foo %]とできるようにしています。別にやらんでも[% c.session.foo %]で取れますけどね…。

その他で自分がやってるのとしたら下記ですね。

  • M(Model)などでconfigの値を取りたいとき

  • 下記のような感じで取れます。
    Project->config->{foo}


  • configはCatalyst::Plugin::Config::YAMLで

  • Project.pmの中で

    use Catalyst qw/Config::YAML/;
    Project->config(config_file => 'config.yml');

    とすれば、configをconfig.ymlというファイル名にしてYAMLで設定を書くことができます。これ自分としては結構便利です。

  • そのC(Controller)の中でグローバルに使いたい関数を定義するには

  • 作ってるアプリの中でグローバルに使いたいんだけどforwardしたくねーよというときには一番上のProject.pmに下記の要に書くとそれを$c->is_post_requestという感じで使うことができるようです。

    sub Project::is_post_request { $_[0]->req->method eq 'POST' }


  • 無理にMVCの中に入れることはない

  • Catalystを使って自分でアプリを作っていたら、Utils.pmとConstants.pmがどうしてもMVCのどれかのディレクトリに入れることができず、結局Project::Utils、Project::Constantsという形にした。useするのがちょと面倒(オイオイ)だけどしかたない。

  • 出力されるログになにか処理を施したい

  • アプリをUTF-8で作ってるけどターミナルはeucなんで、ログで出てくる文字が化けるよ!というときに下記のようにするとeucで出力できるようになる。
    これを使えば、他にもいろいろな処理を挟むことができると思う。これは主に開発時用のTipsですね。
    sub Catalyst::Log::_log {
          my $self    = shift;
          my $level   = shift;
          my $time    = localtime(time);
          my $message = join( "\n", @_ );
          printf( STDERR "[%s] [catalyst] [%s] %s\n", $time, $level, Unicode::Japanese->new($message)->euc );
    }

自分で気がついたのはこのくらいですけど、たぶん間違いとかこうやった方がよいというのが沢山ありそうなので、その際はご指摘お願いします。