アプリケーション

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

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

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

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

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

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

アプリケーションもまた、Yii のほとんど全てのクラスと同じように コンポーネント であるということに 注意して下さい。このことは、二つのことを意味します。

  • 素の PHP オブジェクトに対する場合のように、任意にプロパティを設定することは出来ません。プロパティはアプリケーションクラスの中で定義されなければなりません。
  • アプリケーションはプロパティを設定するためのセッターメソッドをサポートしています。例えば、import というプロパティは setImport メソッドによって定義されており、次のようにして設定します。
array(
    'import'=>array(
        'application.components.*',
    ),
)

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

return array(...);

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

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

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

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

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

アプリケーションベースディレクトリより下の内容はウェブユーザによってアクセスされないように保護される必要があります。 Apache HTTP サーバ を用いる場合、.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$

Be the first person to leave a comment

Please to leave your comment.