アプリケーションは サービス・ロケータ です。
アプリケーションは、リクエストを処理するためのいろいろなサービスを提供する一組の アプリケーション・コンポーネント と呼ばれるものをホストします。
例えば、urlManager
がウェブ・リクエストを適切なコントローラにルーティングする役割を負い、
db
コンポーネントが DB 関連のサービスを提供する、等々です。
全てのアプリケーション・コンポーネントは、それぞれ、同一のアプリケーション内で他のアプリケーション・コンポーネントから区別できるように、ユニークな ID を持ちます。 アプリケーション・コンポーネントには、次の式によってアクセス出来ます。
\Yii::$app->componentID
例えば、\Yii::$app->db
を使って、アプリケーションに登録された DB 接続 を取得することが出来ます。
また、\Yii::$app->cache
を使って、プライマリ・キャッシュ を取得できます。
アプリケーション・コンポーネントは、上記の式を使ってアクセスされた最初の時に作成されます。 二度目以降のアクセスでは、同じコンポーネント・インスタンスが返されます。
どのようなオブジェクトでも、アプリケーション・コンポーネントとすることが可能です。 アプリケーションの構成情報 の中で yii\base\Application::$components プロパティを構成することによって、アプリケーション・コンポーネントを登録することが出来ます。 例えば、
[
'components' => [
// クラス名を使って "cache" コンポーネントを登録
'cache' => 'yii\caching\ApcCache',
// 構成情報の配列を使って "db" コンポーネントを登録
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
// 無名関数を使って "search" コンポーネントを登録
'search' => function () {
return new app\components\SolrService;
},
],
]
情報: 必要なだけ多くのアプリケーション・コンポーネントを登録することが出来ますが、慎重にしなければなりません。 アプリケーション・コンポーネントはグローバル変数のようなものです。 あまり多くのアプリケーション・コンポーネントを使うと、コードのテストと保守が困難になるおそれがあります。 多くの場合、必要なときにローカルなコンポーネントを作成して使用するだけで十分です。
上述のように、アプリケーション・コンポーネントは最初にアクセスされた時に初めてインスタンスが作成されます。 リクエストの間に全くアクセスされなかった時は、インスタンスは作成されません。 けれども、場合によっては、明示的にアクセスされないときでも、リクエストごとにアプリケーション・コンポーネントのインスタンスを作成したいことがあります。 そうするために、アプリケーションの bootstrap プロパティのリストにそのコンポーネントの ID を挙げることが出来ます。
また、カスタマイズされたコンポーネントをブートストラップするためにクロージャを用いることも出来ます。インスタンス化されたコンポーネントを返すことは要求されません。 単に yii\base\Application のインスタンス化の後にコードを走らせるだけのためにクロージャを使うことも出来ます。
例えば、次のアプリケーション構成情報は、log
コンポーネントが常にロードされることを保証するものです。
[
'bootstrap' => [
'log',
function($app){
return new ComponentX();
},
function($app){
// 何らかのコード
return;
}
],
'components' => [
'log' => [
// "log" コンポーネントの構成情報
],
],
]
Yii は固定の ID とデフォルトの構成情報を持つ一連の コア・アプリケーション・コンポーネントを定義しています。 例えば、request コンポーネントは、ユーザ・リクエストに関する情報を収集して、 それを ルート として解決するために使用されます。 また、db コンポーネントは、それを通じてデータ・ベースクエリを実行できるデータベース接続を表現します。 Yii のアプリケーションがユーザ・リクエストを処理出来るのは、まさにこれらのコア・アプリケーション・コンポーネントの助けがあってこそです。
下記が事前に定義されたコア・アプリケーション・コンポーネントです。 通常のアプリケーション・コンポーネントに対するのと同様に、これらを構成し、カスタマイズすることが出来ます。 コア・アプリケーション・コンポーネントを構成するときは、クラスを指定しない場合は、デフォルトのクラスが使用されます。
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.