Catalystの仕組み
Catalystは非常にシンプルなフレームワークです。
複雑な処理は、CPAN(シーパン)にあがっているさまざまなモジュール郡と連携するよう設計されています。
Catalystの処理の流れは、
1.リクエスト
2.ディスパッチ
3.アクション実行
4.データ操作
5.ビューの作成
6.レスポンス
という流れで実行されていきます。
下記の画像がそのイメージとなります。
処理の流れの説明
■ディスパッチ
Catalystへのリクエストは、Catalyst::Engin のモジュール郡が、
要求されたURLがどのアクションに対応するかを結びつけます。
アクションとは、
コントローラーの中に定義されたメソッドです。
これらのメソッド(サブルーチン)には、アトリビュートと呼ばれる特別な文字列が付加されています。
sub index : Private { }
この「Private」がアトリビュートです。
※アトリビュートについては後述します。
Catalyst::Engineは、ディスパッチ処理により
URLをアクションに結びつけ、
リクエストデータを処理するオブジェクト(Catalyst::Request)と、
レスポンスデータを処理するオブジェクト(Catalyst::Response)を作成し、
結びつけたアクションを実行します。
パスとコントローラークラスの関係は下記のようになります。
パス |
クラス |
メソッド |
アトリビュート |
/ |
MyApp::Contoroller::Root |
index |
Private |
/test |
MyApp::Contoroller::Root |
test |
Local |
/* |
MyApp::Contoroller::Root |
default |
Private |
/test/ |
MyApp::Contoroller::Test |
index |
Private |
/test/hello |
MyApp::Contoroller::Test |
hello |
Local |
|
▼アトリビュートについて
Local
/test/hello の最後の「/」まで「/test/」を除いた hello が
Localアトリビュートとして定義されていれば、そのアクションが呼ばれます。
Private
内部的に使われるアクション
予約されている動作をするアクションについています。
Global
Globalをつけると、クラス名とパスの対応は無視され、
ルートのパスとして扱われます。
Path(/path)
リクエストURLが 「/path」に一致した場合に実行されるアクションとなります。
■データ操作
コントローラーでのアクション処理の必要に応じて、データベースへのアクセスが必要となります。
データベースのデータ管理をする処理を実装したモデルを通して、
データの取得や更新処理を行います。
Catalyst::Model を継承して作成します。
最近の流行は、
Catalyst::Model::DBIC::Schema を用いて DBIx::Class を利用し、
データベースを操作する方法となります。
※こちらは別の機会にご紹介します。
■ビュー作成
Catalyst::View を継承したクラスを利用して、
ユーザへ返すレスポンスのビューを作成します。
ビューには、HTMLを返すほか、ファイルのダウンロードなども、こちらの処理に含まれます。
最近では、
Catalyst::View::TT を利用し、Template Toolkit というテンプレートエンジンを利用するのがポピュラーです。
■レスポンス
モデル処理、ビューの作成処理を終え、Catalyst::Response オブジェクトが生成され、
Catalyst::Engin を経由してクライアントに返されます。
コンテキストオブジェクト
アクション処理の中で、重要な変数があります。
コンテキストオブジェクトです。
コンテキストオブジェクトから、他のオブジェクトのメソッドが使えるように、
Catalyst では設計されています。
requestメソッド
Catalyst::Request オブジェクトを返します。
paramメソッドを利用し、リクエストのパラメータを取得できます。
reqメソッドという短い名前でも提供されています。
my $name = $c->req->param('name');
$name 変数に、URLへのリクエスト時に付与されている name パラメータの値が取得出来ます。
responseメソッド
Catalyst::Response オブジェクトを返します。
resメソッドという短い名前でも提供されています。
アプリケーションからクライアントへ処理を返す内容を制御できます。
$c->res->status(404);
ステータス 404 のレスポンスコードをクライアントへ返す。
configメソッド
Calyst::Config オブジェクトを返します。
アプリケーションの設定や、YAMLでの設定ファイルの値を取得出来ます。
stashメソッド
一度のリクエスト処理中に値を保持しておける「スタッシュ」と呼ばれるものです。
ハッシュ値としてデータを保存しておけ、どこからでも呼び出せます。
また、stashに値をセットする事で、自動的にテンプレートエンジン(Catalyst::View)で扱う変数へも
値が展開されるようになっています。
まとめ
Catalyst の内部的な仕組みと、
処理の流れ、重要なコンテキストオブジェクトを見てきました。
Catalyst は、テンプレートエンジンを利用しなくとも、
HTTPのレスポンスとボディを返す事が出来るため、
$c->req->param('name') だけで値を取得し、
何かしらの処理を施し、クライアントへ返すというアプリケーションは、
簡単に作成する事が可能です。
しかし、複雑なデザインや機能と組み合わせて使っていく事を想定し、
別の章では、テンプレートエンジンの利用について記載したいと思います。