アプリケーションはサービスロケーターです。リクエストの処理に様々なサービスを提供する、いわゆるアプリケーションコンポーネントのセットをホストします。例えば、urlManager
コンポーネントはWebリクエストを適切なコントローラーにルーティングする役割を担い、db
コンポーネントはDB関連のサービスを提供します。
各アプリケーションコンポーネントには、同じアプリケーション内の他のアプリケーションコンポーネントの中で一意に識別されるIDがあります。下記の式を使用してアプリケーションコンポーネントにアクセスできます。
\Yii::$app->componentID
例えば、\Yii::$app->db
を使用してDB接続を取得し、\Yii::$app->cache
を使用してアプリケーションに登録されているプライマリキャッシュを取得できます。
アプリケーションコンポーネントは、上記式を通じて初めてアクセスされた時に作成されます。それ以降のアクセスでは、同じコンポーネントインスタンスが返されます。
アプリケーションコンポーネントは任意のオブジェクトにすることができます。アプリケーション設定でyii\base\Application::$componentsプロパティを設定することで、それらを登録できます。例えば、
[
'components' => [
// register "cache" component using a class name
'cache' => 'yii\caching\ApcCache',
// register "db" component using a configuration array
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=demo',
'username' => 'root',
'password' => '',
],
// register "search" component using an anonymous function
'search' => function () {
return new app\components\SolrService;
},
],
]
情報: 必要なだけ多くのアプリケーションコンポーネントを登録できますが、慎重に行う必要があります。アプリケーションコンポーネントはグローバル変数のようなものです。アプリケーションコンポーネントを多く使用すると、コードのテストと保守が困難になる可能性があります。多くの場合、ローカルコンポーネントを作成して、必要に応じて使用できます。
前述のように、アプリケーションコンポーネントは初めてアクセスされたときにのみインスタンス化されます。リクエスト中に全くアクセスされない場合は、インスタンス化されません。しかし、明示的にアクセスされなくても、すべてのリクエストでアプリケーションコンポーネントをインスタンス化したい場合があります。そのためには、アプリケーションのbootstrapプロパティにそのIDをリストすることができます。
クロージャを使用してカスタマイズされたコンポーネントをブートストラップすることもできます。インスタンス化されたコンポーネントを返す必要はありません。クロージャは、yii\base\Applicationのインスタンス化後にコードを実行するためにも使用できます。
例えば、次のアプリケーション設定では、log
コンポーネントが常にロードされるようになります。
[
'bootstrap' => [
'log',
function($app){
return new ComponentX();
},
function($app){
// some code
return;
}
],
'components' => [
'log' => [
// configuration for "log" component
],
],
]
Yiiは、固定IDとデフォルト設定を持つコアアプリケーションコンポーネントのセットを定義しています。例えば、requestコンポーネントは、ユーザーリクエストに関する情報を収集し、ルートに解決するために使用されます。dbコンポーネントは、データベースクエリを実行できるデータベース接続を表します。これらのコアアプリケーションコンポーネントの助けを借りて、Yiiアプリケーションはユーザーリクエストを処理できます。
以下は、事前に定義されたコアアプリケーションコンポーネントのリストです。通常のアプリケーションコンポーネントと同様に、それらを構成およびカスタマイズできます。コアアプリケーションコンポーネントを設定する場合、クラスを指定しない場合は、デフォルトのクラスが使用されます。
タイプミスを見つけたり、このページの改善点があれば教えてください。
Githubで編集する !
コメントするにはサインアップまたはログインしてください。