目次
Catalyst
注意:最近追ってないので情報が怪しいです!
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が呼ばれる
- begin : Private
- auto : Private
- hello : Local
- 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 へリクエストすると
- Root::begin
- Root::auto
- Hoge::hello
- Root::end
/hoge/hello へリクエスト
- Root::begin
- Root::auto
- Hoge::auto
- Hoge::hello
- Root::end
/hoge/fuga/hello を呼ぶと…
- Hoge::Fuga::begin
- Root::auto
- Hoge::auto
- Hoge::Fuga::auto
- Hoge::Fuga::hello
- 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テストサーバでも同一コードでサーバのパスが取得できる