Catalyst入門 と お作法について

id:naoyaの技術発表(10月15日の技術勉強会 - はてな技術発表会日記 - 機能変更、お知らせなど)。
これを聞いて、Catalyst面白そうということに気づいて触ってみています。

インストールと簡単な動作

Perl の MVC フレームワーク Catalyst に入門してみた : NDO::Weblogを一通り読めば分かると思います。
私の環境だと

sudo perl -MCPAN -e 'install Class::DBI::mysql'

を追加で行う必要がありました。

お作法

Catalystではどう書くのが正しいか等、迷う部分が多々あります。
いろいろ調べた結果、これだと思うものを紹介していき、標準化(?)のたたき台になればよいかなと。

URLマッピング

CatalystのURLマッピングはとても柔軟です。たくさん種類があってこまりますw。


直接URLを指定 /foo/bar

sub hoge : Path('foo/bar') {}

MyApp.pmで /hoge

sub hoge : Global {}

正規表現で /user/ユーザー名

sub username : Regex('^user/(\w+)$') {}


マッチした文字列は、snippetsで取れる。

    my $username = $c->req->snippets->[0];


追記:
Controllerを細かく作るというのを書き忘れてました。

forwardの種類

$c->forward('メソッド名')
$c->forward('パス')
$c->forward(qw/MyApp::M::Hello say_hello/); # クラスへのフォワード

Viewへのforward

毎回、Viewへ forward するのはとても面倒なので end を定義しておくと楽。

sub end : Private {
    my ( $self, $c ) = @_;
    $c->forward('MyApp::V::TT') unless $c->res->output;
}

静的なコンテンツをどう扱うか?

/images/hoge.png という画像にアクセスされたときは、root/images/hoge.png を返したいという場合。
cssJavaScriptなどもこの部類だろう。
これも統一的な手法が見つからなかったので、以下の方法を提案してみるテスト。
Webサーバに依存しない方法となるとこんな感じかなぁ。(ディレクトリ単位でRegexもありかと思います。)

sub static : Regex('\.(jpg|jpeg|gif|png|css|js|ico)$') {
    my ( $self, $c ) = @_;
    $c->serve_static;
}

id:naoyaからツッコミが

Static なコンテンツは Catalyst::Plugin::Static::Simple でやると楽です

templateの include

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

[% include templates/user/username.tt %]

CDBIでテーブルのリレーションを使う

Catalystのヘルパースクリプトで自動生成される、CDBI用ののコードのままではリレーションが使えません。
自分で、ファイルに追記してあげないと駄目です。


たとえば collectionテーブルとcollectiontypeテーブルのリレーションならば
Collection.pmを編集。

__PACKAGE__->columns(Primary => qw/type name/);

__PACKAGE__->has_a(type => "MyAPP::M::CDBI::CollectionType");


こんな感じ。
くれぐれも、テーブル追加時ヘルパースクリプトを安易に起動しないように・・・(上書きされちゃいます)


おまけ Catalystはてなフレームワーク

はてな社内ではCatalystの良いところは、はてなフレームワークに積極的に取り入れようという雰囲気になっています。
昨日も、「エラー発生時にブラウザにスタックとレースなどを表示する機能」を id:naoya が作っていました。


これまでは、Apacheのエラーログを tail -f などしていたのですが、他の開発者のエラーと混じるのでかなり困っていたのが大改善。
技術的には、mod_perlのハンドラでごにょごにょするだけなのですが、かなり開発効率が上がると思います。

最後に

Catalystのお作法について、「自分はこうやっているよ!」などありましたらぜひトラックバックなり、コメントをください。
みんな同じ部分で迷っているのではないだろうか?と思う今日この頃。

追記:その後