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 %%
という文字を含む文字列を書き込むには.
パラメータ
パラメータを定義して、サービス定義の一部として使用することができます。これにより、より定期的に変更したい値を分離することができます。
parameters:
dsn: 'mysql:host=127.0.0.1;dbname=test'
user: root
password: secret
foo
パラメータは、設定ファイル内の他の場所で%foo%
を介して参照することができます。また、'%wwwDir%/images'
のような文字列の中で使用することもできます。
パラメータは単なる文字列である必要はなく、配列の値でもかまいません。
parameters:
mailer:
host: smtp.example.com
secure: ssl
user: franta@gmail.com
languages: [cs, en, de]
一つのキーを%mailer.user%
と呼ぶことができます。
もし、コードの中で、例えばクラスの中で、何らかのパラメータの値を取得する必要がある場合は、このクラスに渡してください。例えば、コンストラクタの中で。パラメータ値を問い合わせることができるグローバル設定オブジェクトはありません。これは依存性注入の原則に反しています。
サービス
別章参照。
デコレーター
特定のタイプの全サービスを一括編集するには?特定の共通の祖先から継承したすべてのプレゼンターに対して、あるメソッドを呼び出す必要がありますか?そこで登場するのがデコレータです。
decorator:
# for all services that are instances of this class or interface
App\UI\BasePresenter:
setup:
- setProjectId(10) # call this method
- $absoluteUrls = true # and set the variable
デコレータは、タグを設定したり、インジェクトモードをオンにしたりするのにも使用できます。
decorator:
InjectableInterface:
tags: [mytag: 1]
inject: true
DI
DIコンテナの技術設定。
di:
# shows DIC in Tracy Bar?
debugger: ... # (bool) defaults to true
# parameter types that you never autowire
excluded: ... # (string[])
# the class from which the DI container inherits
parentClass: ... # (string) defaults to Nette\DI\Container
メタデータエクスポート
DIコンテナクラスには、多くのメタデータも含まれています。メタデータのエクスポートを減らすことで、それを軽減することができます。
di:
export:
# to export parameters?
parameters: false # (bool) defaults to true
# export tags and which ones?
tags: # (string[]|bool) the default is all
- event.subscriber
# export data for autowiring and which?
types: # (string[]|bool) the default is all
- Nette\Database\Connection
- Symfony\Component\Console\Application
$container->getParameters()
配列を使用しない場合は、パラメータのエクスポートを無効にすることができます。さらに、$container->findByTag(...)
メソッドを使って、サービスを取得するタグだけをエクスポートすることができます。
このメソッドを全く呼び出さない場合は、false
を使ってタグのエクスポートを完全に無効にすることができます。
$container->getByType()
メソッドのパラメータとして使用するクラスを指定すれば、自動配線のためのメタデータを大幅に減らすことができます。
そしてまた、もしあなたがこのメソッドを全く呼ばないのであれば(あるいはbootstrapの中だけでNette\Application\Application
)、false
で完全にエクスポートを無効にすることができます。
拡張機能
他のDI拡張を登録する。このようにして、例えばDI拡張Dibi\Bridges\Nette\DibiExtension22
をdibi
という名前で追加します。
extensions:
dibi: Dibi\Bridges\Nette\DibiExtension22
そして、その中のdibi
というセクションで設定します。
dibi:
host: localhost
また、パラメータを持つ拡張クラスを追加することができます。
extensions:
application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
ファイルのインクルード
includes
セクションに、追加の設定ファイルを挿入することができます。
includes:
- parameters.php
- services.neon
- presenters.neon
parameters.php
という名前はタイプミスではありません。設定は PHP
ファイルに書くこともでき、その場合は配列として返されます。
<?php
return [
'database' => [
'main' => [
'dsn' => 'sqlite::memory:',
],
],
];
同じキーを持つ項目が設定ファイル内に現れた場合、それらは上書きされるか、配列の場合はされます。後からインクルードされたファイルは、前のファイルより優先順位が高くなります。includes
セクションが記載されているファイルは、それに含まれるファイルよりも優先順位が高くなります。
検索
DIコンテナにサービスを自動追加することで、非常に快適に作業ができます。Netteは自動的にPresenterをコンテナに追加しますが、それ以外のクラスも簡単に追加することができます。
どのディレクトリ(およびサブディレクトリ)でクラスを検索するかを指定するだけです。
search:
- in: %appDir%/Forms
- in: %appDir%/Model
しかし、通常は、すべてのクラスとインターフェイスを追加したくないので、フィルタリングすることができます。
search:
- in: %appDir%/Forms
# filtering by file name (string|string[])
files:
- *Factory.php
# filtering by class name (string|string[])
classes:
- *Factory
あるいは、以下のクラスのうち少なくともひとつを継承するか実装しているクラスを選択することもできます。
search:
- in: %appDir%
extends:
- App\*Form
implements:
- App\*FormInterface
また、クラス名のマスクや祖先など、否定的なルールを定義することもでき、それらに従った場合、そのサービスはDIコンテナに追加されなくなります。
search:
- in: %appDir%
exclude:
ファイル: ...
classes: ...
extends: ...
implements: ...
追加されたサービスにはタグを設定することができます。
search:
- in: %appDir%
tags: ...
マージ
同じキーを持つ項目が複数の設定ファイルに存在する場合、それらは上書きされるか、配列の場合はマージされます。後で組み込まれたファイルの方が優先されます。
config1.neon | config2.neon | 結果 |
---|---|---|
|
|
|
特定の配列のマージを防ぐには、配列名の直後にエクスクラメーションマークを付けます。
config1.neon | config2.neon | 結果 |
---|---|---|
|
|
|