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\DibiExtension22dibi という名前で追加します。

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 結果
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

特定の配列のマージを防ぐには、配列名の直後にエクスクラメーションマークを付けます。

config1.neon config2.neon 結果
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
version: 3.x