トップページ >  perl >  Catalystの仕組み
初版2012/04/18: 最終更新日2012/04/18
Catalystの仕組み
目次
Catalyst 処理の流れ
処理の流れの説明
コンテキストオブジェクト
まとめ
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') だけで値を取得し、
    何かしらの処理を施し、クライアントへ返すというアプリケーションは、
    簡単に作成する事が可能です。

    しかし、複雑なデザインや機能と組み合わせて使っていく事を想定し、
    別の章では、テンプレートエンジンの利用について記載したいと思います。