DIコンテナの設定
Nette DIコンテナの設定オプションの概要を説明します。
設定ファイル
Nette DIコンテナは、設定ファイルを使って簡単に制御することができます。設定ファイルは通常、NEON形式で記述されます。編集には、この形式に対応したエディタを使用することをお勧めします。
decorator: Decorator
di: DI Container
extensions: Install additional DI extensions
includes: Including files
parameters: Parameters
search: Automatic service registration
services: Services
%
, you must escape it by doubling it to %%
という文字を含む文字列を書き込むには.
パラメータ
パラメータを定義して、サービス定義の一部として使用することができます。これにより、より定期的に変更したい値を分離することができます。
foo
パラメータは、設定ファイル内の他の場所で%foo%
を介して参照することができます。また、'%wwwDir%/images'
のような文字列の中で使用することもできます。
パラメータは単なる文字列である必要はなく、配列の値でもかまいません。
一つのキーを%mailer.user%
と呼ぶことができます。
もし、コードの中で、例えばクラスの中で、何らかのパラメータの値を取得する必要がある場合は、このクラスに渡してください。例えば、コンストラクタの中で。パラメータ値を問い合わせることができるグローバル設定オブジェクトはありません。これは依存性注入の原則に反しています。
サービス
別章参照。
デコレーター
特定のタイプの全サービスを一括編集するには?特定の共通の祖先から継承したすべてのプレゼンターに対して、あるメソッドを呼び出す必要がありますか?そこで登場するのがデコレータです。
デコレータは、タグを設定したり、インジェクトモードをオンにしたりするのにも使用できます。
DI
DIコンテナの技術設定。
怠惰なサービス
lazy: true
を設定することで、サービスの遅延作成を有効にする。これは、DIコンテナから要求されたときにサービスが実際に作成されるのではなく、最初の使用時にのみ作成されることを意味する。特定のリクエストに必要なサービスだけが作成されるため、
アプリケーションの起動を高速化し、メモリ使用量を削減することができる。
特定のサービスについては、遅延作成を調整することができます。
遅延オブジェクトはユーザー定義クラスに対してのみ使用可能で、 PHP の内部クラスに対しては使用できません。PHP 8.4 以降が必要です。
メタデータエクスポート
DIコンテナクラスには、多くのメタデータも含まれています。メタデータのエクスポートを減らすことで、それを軽減することができます。
$container->getParameters()
配列を使用しない場合は、パラメータのエクスポートを無効にすることができます。さらに、$container->findByTag(...)
メソッドを使って、サービスを取得するタグだけをエクスポートすることができます。
このメソッドを全く呼び出さない場合は、false
を使ってタグのエクスポートを完全に無効にすることができます。
$container->getByType()
メソッドのパラメータとして使用するクラスを指定すれば、自動配線のためのメタデータを大幅に減らすことができます。
そしてまた、もしあなたがこのメソッドを全く呼ばないのであれば(あるいはbootstrapの中だけでNette\Application\Application
)、false
で完全にエクスポートを無効にすることができます。
拡張機能
他のDI拡張を登録する。このようにして、例えばDI拡張Dibi\Bridges\Nette\DibiExtension22
をdibi
という名前で追加します。
そして、その中のdibi
というセクションで設定します。
また、パラメータを持つ拡張クラスを追加することができます。
ファイルのインクルード
includes
セクションに、追加の設定ファイルを挿入することができます。
parameters.php
という名前はタイプミスではありません。設定は PHP
ファイルに書くこともでき、その場合は配列として返されます。
同じキーを持つ項目が設定ファイル内に現れた場合、それらは上書きされるか、配列の場合はされます。後からインクルードされたファイルは、前のファイルより優先順位が高くなります。includes
セクションが記載されているファイルは、それに含まれるファイルよりも優先順位が高くなります。
検索
DIコンテナにサービスを自動追加することで、非常に快適に作業ができます。Netteは自動的にPresenterをコンテナに追加しますが、それ以外のクラスも簡単に追加することができます。
どのディレクトリ(およびサブディレクトリ)でクラスを検索するかを指定するだけです。
しかし、通常は、すべてのクラスとインターフェイスを追加したくないので、フィルタリングすることができます。
あるいは、以下のクラスのうち少なくともひとつを継承するか実装しているクラスを選択することもできます。
また、クラス名のマスクや祖先など、否定的なルールを定義することもでき、それらに従った場合、そのサービスはDIコンテナに追加されなくなります。
追加されたサービスにはタグを設定することができます。
マージ
同じキーを持つ項目が複数の設定ファイルに存在する場合、それらは上書きされるか、配列の場合はマージされます。後で組み込まれたファイルの方が優先されます。
config1.neon | config2.neon | 結果 |
---|---|---|
特定の配列のマージを防ぐには、配列名の直後にエクスクラメーションマークを付けます。
config1.neon | config2.neon | 結果 |
---|---|---|