ユーザ用ツール

サイト用ツール


catalyst

Catalyst

注意:最近追ってないので情報が怪しいです!

Catalyst - Web Framework

CatalystはPerlのMVC Webフレームワーク。各コンポーネントは、RailsのActiveRecord等のように固定ではなくPerlの様々なライブラリから選択可能。例えばViewにTemplate-ToolkitやMason、ModelとしてClass:DBIやDBIx::Classから選択することができる。

なお、Catalystとは化学用語で触媒のこと。触媒とは反応前後でそれ自体変化せずに他の物質の化学反応を促進する物質である。

環境

  • CentOS 5
  • Perl 5.8.8
  • Catalyst 5.7

以下のはろーわーるどセットアップ手順はCatalyst知識ゼロの状態の人間が実際に動かしながら書いているため、間違いが多数あるかもしれません。注意してください。

インストール

OSはCentOS5。GCCが入ってなければ場合は先に入れておけ。あとmysqlも

# yum intall gcc
# yum intall gcc-c++
# yum install mysql
# yum install mysql-server

mysql-serverと同時にインストールされるBD::mysqlはバージョンが多少古いが、Catalystをインストールするときに上書きされるので気にしない。

開発用パッケージをインストール

# cpan Catalyst::Devel

本番環境など実行するだけならCatalyst::Runtimeを入れる

# cpan Catalyst::Runtime

アプリケーションの作成

Hogeアプリケーションの雛形を作成する。適当なフォルダで以下のコマンドを実行

$ catalyst.pl Hoge

Hogeフォルダが作成され、中にアプリの雛形が作成される。以下のコマンドでテスト用サーバを起動(Railsにおけるwebrickみたいなの)できる。

$ cd Hoge
$ ./script/hoge_server.pl

サーバ起動時にスクリプトを変更しても反映されない。変更が即座に反映されるようにするにはrオプションで起動する。

$ ./script/hoge_server.pl -r

以下このHogeフォルダを${APP_ROOT}とする。

コントローラ作成

ヘルパースクリプトでコントローラを作成

$ ./script/hoge_create.pl controller Test

新しいコントローラクラス、${APP_ROOT}/lib/Hoge/Controller/Test.pm が生成される。このコントローラはURLのパスが/test/以下の処理を担当する。

Test.pmはこんな感じ

# /test/ へのアクセス
sub index : Private {
    my ($self, $c) = @_;
 
    $c->response->body('.....')
}
 
# URLに対応するサブルーチンが見つからない
sub default : Private {
    my ($self, $c) = @_;
 
    $c->response->status(404);
    $c->response->body("not found");
}
 
# パス ''/test/hello'' へのリクエストを処理するアクションメソッド
sub hello : Local {
    my ($self, $c) = @_;
    # 処理
}
 
# アクションメソッドの前処理
sub begin : Private {
    my ($self, $c) = @_;
    # 処理
}
 
# アクションメソッドの前処理
sub auto : Private {
    my ($self, $c) = @_;
    # 処理
}
 
# アクションメソッドの後処理
sub end : Private {
    my ($self, $c) = @_;
    # 処理
}

LocalだのPrivateだの見慣れないものはアトリビュートというらしい。

/test/helloにアクセスした場合、以下の順番でsubが呼ばれる

  1. begin : Private
  2. auto : Private
  3. hello : Local
  4. end : Private

autoとbeginの違いは、下の階層でオーバーライドされるかどうか。autoは

Root.pm
 - begin : Private
 - auto : Private
 - end : Private
Piyo.pm
 - hello : Local
Hoge.pm
 - auto : Private
 - hello : Local
Hoge::Fuga.pm
 - begin : Private
 - hello : Local
 - end : Private

という感じでControllerを作ったとき

/piyo/hello へリクエストすると

  1. Root::begin
  2. Root::auto
  3. Hoge::hello
  4. Root::end

/hoge/hello へリクエスト

  1. Root::begin
  2. Root::auto
  3. Hoge::auto
  4. Hoge::hello
  5. Root::end

/hoge/fuga/hello を呼ぶと…

  1. Hoge::Fuga::begin
  2. Root::auto
  3. Hoge::auto
  4. Hoge::Fuga::auto
  5. Hoge::Fuga::hello
  6. Hoge::Fuga::end

の順番に呼ばれる。

深い場所でbegin、endを定義するとオーバーライドされる。autoは浅い方から全て実行される。アクセス認可処理などは浅い方のautoに記述すると良い。

モデル

ビュー

プラグイン

認証処理

テスト用サーバ

起動

$ ./script/hoge_server.pl
  • -r ファイル変更時に自動リロード
  • -k キープアライブを有効に
  • -f フォークして並列リクエスト処理
  • -p 80 80番ポートで起動

ログをファイルに出してコマンドラインに復帰

$ ./script/hoge_server 1>hoge.log 2>&1 &

Apache(mod_perl)へのデプロイ

mod_perlのインストール

最近のLinuxディストリビューション(CentOS、Debian、Ubuntu等)ではApacheと一緒にインストールしてあることが多い。

CatalystのApache用エンジンをインストール

$ sudo cpan Catalyst::Engine::Apache

設定ファイル

catalystのディレクトリが /var/www/catalyst にあり、catalyst アプリケーションは Paulownia::Web で作成したとする。

$ catalyst.pl Paulownia::Web

catalystアプリをドキュメントルートではなくパス /app にデプロイする場合

# ライブラリの場所を指定
PerlSwitches -I/var/www/app/Paulownia-Web/lib
 
# catalystアプリケーションモジュールを読み込む
PerlModule Paulownia::Web
 
# staticディレクトリ以下を Apache に直接処理させる
Alias /app/static /var/www/app/Paulownia-Web/root/static
<Location /app/static>
  SetHandeler default-handler
</Location>
 
# catalystアプリケーションを /app にデプロイ
<Location /cms>
  SetHandler perl-script
  PerlResponseHandeler Paulownia::Web
</Location>
 
# mod_perlのステータス監視用(Catalystアプリを動作させるには不要)
<Location /perl-status>
  SetHandler perl-script
  PerlResponseHandeler Apache2::Status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
</Location>

Aliasの順番に注意、逆にするとstatic以下もcatalystが配信してしまう。静的ファイルは Apache が直接配信するので、Static::Simpleプラグイン等を読み込ませる必要は無い。

権限

mod_perlで実行した場合の権限は、ApacheのUser ディレクティブ、Group ディレクティブで設定したユーザ・グループの権限となる。

mod_perlでカレントディレクトリが変わる

ので、./ とか使わずCatalystの機能を使ってディレクトリを取るべし

デプロイ先のパス取得

$c->config->{home}

catalystのrootディレクトリ取得

$c->config->{root}

でmod_perl環境でもperlテストサーバでも同一コードでサーバのパスが取得できる

catalyst.txt · 最終更新: 2010/01/28 06:32 by 127.0.0.1