DIコンテナの設定

Nette DIコンテナの設定オプションの概要。

設定ファイル

Nette DIコンテナは、設定ファイルを使用して簡単に制御できます。これらは通常、NEON形式で記述されます。編集には、この形式をサポートするエディタをお勧めします。

 decorator: 	デコレータ
di: DIコンテナ
extensions: 追加のDI拡張機能のインストール
includes: ファイルのインクルード
parameters: パラメータ
search: サービスの自動登録
services: サービス

% 文字を含む文字列を記述したい場合は、%% と二重にしてエスケープする必要があります。

パラメータ

設定内でパラメータを定義し、それらをサービス定義の一部として使用できます。これにより、設定を明確にしたり、変更される値を統合して分離したりできます。

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

パラメータ dsn は、設定内のどこでも %dsn% と記述して参照できます。パラメータは '%wwwDir%/images' のような文字列内でも使用できます。

パラメータは文字列や数値だけでなく、配列を含むこともできます:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

特定のキーは %mailer.user% のように参照します。

コード内、例えばクラス内で、任意のパラメータの値を知る必要がある場合は、そのクラスに渡します。例えばコンストラクタで。パラメータの値をクラスが問い合わせるような、設定を表すグローバルオブジェクトは存在しません。それは依存関係注入の原則に反します。

サービス

別の章を参照

Decorator

特定の型のすべてのサービスを一括して変更するにはどうすればよいでしょうか?例えば、特定の共通の親クラスを継承するすべてのPresenterで特定のメソッドを呼び出すには?そのためにデコレータがあります。

decorator:
	# このクラスまたはインターフェースのインスタンスであるすべてのサービスに対して
	App\Presentation\BasePresenter:
		setup:
			- setProjectId(10)       # このメソッドを呼び出す
			- $absoluteUrls = true   # そして変数を設定する

デコレータは、タグの設定やinjectモードの有効化にも使用できます。

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

DIコンテナの技術設定。

di:
	# Tracy Bar に DIC を表示しますか?
	debugger: ...        # (bool) デフォルトは true

	# 決してオートワイヤリングしないパラメータの型
	excluded: ...        # (string[])

	# サービスの遅延生成を許可しますか?
	lazy: ...            # (bool) デフォルトは false

	# DIコンテナが継承するクラス
	parentClass: ...     # (string) デフォルトは Nette\DI\Container

遅延サービス

lazy: true 設定は、サービスの遅延(遅延)生成を有効にします。これは、サービスがDIコンテナから要求された瞬間に実際に作成されるのではなく、初回使用時に作成されることを意味します。これにより、特定のリクエストで実際に必要なサービスのみが作成されるため、アプリケーションの起動が高速化され、メモリ要件が削減される可能性があります。

特定のサービスに対して、遅延生成は変更できます

遅延オブジェクトは、ユーザー定義クラスにのみ使用でき、PHP内部クラスには使用できません。PHP 8.4以降が必要です。

メタデータのエクスポート

DIコンテナクラスには多くのメタデータも含まれています。メタデータのエクスポートを削減することで、そのサイズを小さくすることができます。

di:
	export:
		# パラメータをエクスポートしますか?
		parameters: false   # (bool) デフォルトは true

		# タグをエクスポートしますか?どのタグを?
		tags:               # (string[]|bool) デフォルトはすべて
			- event.subscriber

		# オートワイヤリング用のデータをエクスポートしますか?どのデータを?
		types:              # (string[]|bool) デフォルトはすべて
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

$container->getParameters() 配列を使用しない場合は、パラメータのエクスポートを無効にできます。さらに、$container->findByTag(...) メソッドでサービスを取得するために使用するタグのみをエクスポートできます。このメソッドをまったく呼び出さない場合は、false を使用してタグのエクスポートを完全に無効にできます。

$container->getByType() メソッドのパラメータとして使用するクラスを指定することで、オートワイヤリング用のメタデータを大幅に削減できます。そして再び、このメソッドをまったく呼び出さない場合(またはbootstrapNette\Application\Application を取得するためだけに使用する場合)、false を使用してエクスポートを完全に無効にできます。

拡張機能

追加のDI拡張機能を登録します。この方法で、例えば Dibi\Bridges\Nette\DibiExtension22 DI拡張機能を 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

		# ファイル名によるフィルタリング (string|string[])
		files:
			- *Factory.php

		# クラス名によるフィルタリング (string|string[])
		classes:
			- *Factory

または、指定されたクラスの少なくとも1つを継承または実装するクラスを選択することもできます:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

除外ルール、つまりクラス名のマスクや継承元の親クラスを定義することもできます。これらが一致する場合、サービスはDIコンテナに追加されません:

search:
	-	in: %appDir%
		exclude:
			files: ...
			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
バージョン: 3.x