アプリケーション

アプリケーションはリクエストが処理される実行コンテキストをカプセル化したオブジェクトです。 その主なタスクは、リクエストに関するいくつかの基本的な情報を収集して、その先の処理を行うために適切なコントローラへリクエストを送出することです。 さらにアプリケーションレベルの初期構成を保つための中心的な場所としても振舞います。 この理由からアプリケーションオブジェクトはフロントコントローラとも呼ばれます。

アプリケーションはエントリースクリプトにより、シングルトンとして生成されます。 アプリケーションシングルトンはどの場所からでもYii::app()としてアクセスすることができます。

1. アプリケーション初期構成

デフォルトでは、アプリケーションオブジェクトはCWebApplicationのインスタンスです。 これをカスタマイズするために、通常は初期構成ファイル(または配列)を提供して、インスタンスの生成時にプロパティ値を初期化します。 アプリケーションをカスタマイズする別の方法は、CWebApplicationを拡張することです。

初期構成はキーと値のペアの要素を持つ配列です。キーはアプリケーションインスタンスのプロパティ名を表します。 値は対応するプロパティの初期値です。 例えば、以下の初期構成ファイルはname及びdefaultControllerプロパティを構成します。

array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)

一般には構成は別のPHPスクリプトに格納されます(例えばprotected/config/main.php)。 このスクリプトの中で、以下のように構成の配列を返します。

return array(...);

構成を適用するには、アプリケーションのコンストラクタに構成ファイル名をパラメータとして渡すか、あるいは以下のように エントリースクリプト中にもよく見られるように、Yii::createWebApplication()に渡します。

$app=Yii::createWebApplication($configFile);

ヒント: もしアプリケーション構成が非常に複雑な場合は、複数のファイルに分割することができます。 それぞれのファイルは構成配列の一部をリターンします。そしてメインの構成ファイルではPHPのinclude()により 他の構成ファイルを組み込み、完全な構成配列にマージします。

2. アプリケーションベースディレクトリ

アプリケーションベースディレクトリは、セキュリティ上注意を要する全てのPHPスクリプトとデータの格納場所のルートディレクトリです。 デフォルトでは、エントリスクリプトを含むディレクトリの下にあるprotectedという名前のサブディレクトリです。 この場所は、アプリケーション構成basePathプロパティ値を変更することでカスタマイズが可能です。

アプリケーションベースディレクトリより下の内容はウェブユーザによってアクセスされないように保護される必要があります。 Apache HTTP serverを用いる場合、.htaccessファイルをベースディレクトリの下に置くことで容易に実現可能です。.htaccessファイルの内容は以下のようになります。

deny from all

3. アプリケーションコンポーネント

アプリケーションオブジェクトの機能はフレキシブルなコンポーネントアーキテクチャによって容易にカスタマイズでき、また充実させることができます。アプリケーションは一連のアプリケーションコンポーネントを管理し、それぞれが個別の機能を実装します。 例えば、アプリケーションはユーザリクエストに関するいくつかの初期処理を実行するために、CUrlManagerコンポーネントとCHttpRequestコンポーネントの助けを借ります。

アプリケーションインスタンスのcomponentsプロパティを構成することによって、 どのアプリケーションコンポーネントを使用する場合でも、クラスとプロパティ値をカスタマイズすることが出来ます。 例えば、以下のように、複数のmemcacheサーバを使用するようにCMemCacheコンポーネントを構成することが可能です。

array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)

上においてはcomponents配列にcache要素を追加しました。そしてcache要素は コンポーネントのクラスがCMemCacheであり、serversプロパティ値がこのようであると記述します。

アプリケーションコンポーネントにアクセスするにはYii::app()->ComponentIDを用いてください。 ここで、ComponentIDはコンポーネントのID(例えばYii::app()->cache)を参照します。

アプリケーションコンポーネントは構成ファイル中でenabledプロパティを偽にセットすることで無効にすることができます。 無効にされたコンポーネントにアクセスするとnullが返されます。

ヒント: デフォルトでは、アプリケーションコンポーネントは必要に応じて生成されます。 これは、アプリケーションコンポーネントはユーザリクエストの間にアクセスされなければ全く生成されないことを意味します。 結果として、アプリケーションが多量のコンポーネントを持つように構成されても全体としての性能は落ちません。 いくつかのアプリケーションコンポーネント(例えばCLogRouter)は、アクセスされるか否かに関わりなく生成される必要があるでしょう。 そうするためには、それらのIDをpreloadアプリケーションプロパティに列挙して下さい。

4. コアアプリケーションコンポーネント

Yiiは、ウェブアプリケーションに共通な機能を提供するために、一連のコアアプリケーションコンポーネントをあらかじめ定義しています。 例えば、requestコンポーネントはユーザリクエストに関する情報を収集し、要求されたURLやクッキーの情報を提供するために使用されます。このようなコアコンポーネントのプロパティ値を構成することによって、我々はYiiのデフォルト動作のほとんど全てを変更することが可能です。

以下はCWebApplicationによってあらかじめ宣言されたコアコンポーネントのリストです。

5. アプリケーションライフサイクル

ユーザリクエストを取り扱うとき、アプリケーションは次のライフサイクルを経ます:

  1. CApplication::preinit()によりアプリケーションをプレ初期化します;

  2. クラス自動ローダとエラー処理を準備します;

  3. コアアプリケーションコンポーネントを登録します;

  4. アプリケーション構成をロードします;

  5. CApplication::init()によりアプリケーションを初期化します; - アプリケーションビヘイビアを登録します;

    • 静的なアプリケーションコンポーネントをロードします;
  6. イベントonBeginRequestを発行します;

  7. ユーザリクエストを処理します:

    • リクエストに関する情報を収集します;
    • コントローラを生成します;
    • コントローラを実行します;
  8. イベントonEndRequestを発行します;

$Id: basics.application.txt 3251 2011-06-01 00:24:06Z qiang.xue $

Be the first person to leave a comment

Please to leave your comment.