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 を返したいという場合。
cssやJavaScriptなどもこの部類だろう。
これも統一的な手法が見つからなかったので、以下の方法を提案してみるテスト。
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入門としてのお作法についてについてからトラックバックをいただいた(素晴らしい)