0 follower

アプリケーション

アプリケーションはリクエスト処理の実行コンテキストを表します。その主なタスクはユーザのリクエストを解析し、その先の処理を行うために適切なコントローラへ処理を移すことです。さらにアプリケーションレベルの初期構成を保つための中心的な場所として振舞います。この理由からアプリケーションはフロントコントローラとも呼ばれます。

アプリケーションはエントリースクリプトにより、シングルトンとして生成されます。 アプリケーションシングルトンはどの場所からでも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プロパティを構成するには、 アプリケーションで使用されるアプリケーションコンポーネントのクラスとプロパティ値をカスタマイズ可能です。 例えば、我々はCMemCacheコンポーネントを複数のmemcacheサーバに対応させるために以下のように構成することが可能です。

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を発行します;