Nette Documentation Preview

syntax
DIコンテナの設定
*********

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


設定ファイル
======

Nette DIコンテナは、設定ファイルを使用して簡単に制御できます。これらは通常、[NEON形式|neon:format]で記述されます。編集には、この形式を[サポートするエディタ |best-practices:editors-and-tools#IDEエディタ]をお勧めします。

<pre>
"decorator .[prism-token prism-atrule]":[#decorator]: 	"デコレータ .[prism-token prism-comment]"<br>
"di .[prism-token prism-atrule]":[#DI]: 			"DIコンテナ .[prism-token prism-comment]"<br>
"extensions .[prism-token prism-atrule]":[#拡張機能]: 	"追加のDI拡張機能のインストール .[prism-token prism-comment]"<br>
"includes .[prism-token prism-atrule]":[#ファイルのインクルード]: 	"ファイルのインクルード .[prism-token prism-comment]"<br>
"parameters .[prism-token prism-atrule]":[#パラメータ]: 	"パラメータ .[prism-token prism-comment]"<br>
"search .[prism-token prism-atrule]":[#Search]: 		"サービスの自動登録 .[prism-token prism-comment]"<br>
"services .[prism-token prism-atrule]":[services]: 		"サービス .[prism-token prism-comment]"
</pre>

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


パラメータ
=====

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

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

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

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

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

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

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


サービス
====

[別の章を参照|services]。


Decorator
=========

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

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

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

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


DI
===

DIコンテナの技術設定。

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

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

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

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


遅延サービス .{data-version:3.2.4}
----------------------------

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

特定のサービスに対して、遅延生成は[変更できます |services#遅延サービス]。

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


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

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

```neon
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()` メソッドのパラメータとして使用するクラスを指定することで、[オートワイヤリング |autowiring]用のメタデータを大幅に削減できます。そして再び、このメソッドをまったく呼び出さない場合(または[bootstrap|application:bootstrapping]で `Nette\Application\Application` を取得するためだけに使用する場合)、`false` を使用してエクスポートを完全に無効にできます。


拡張機能
====

追加のDI拡張機能を登録します。この方法で、例えば `Dibi\Bridges\Nette\DibiExtension22` DI拡張機能を `dibi` という名前で追加します。

```neon
extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22
```

その後、`dibi` セクションで設定します:

```neon
dibi:
	host: localhost
```

パラメータを持つクラスを拡張機能として追加することもできます:

```neon
extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)
```


ファイルのインクルード
===========

`includes` セクションで他の設定ファイルをインクルードできます:

```neon
includes:
	- parameters.php
	- services.neon
	- presenters.neon
```

`parameters.php` という名前はタイプミスではありません。設定はPHPファイルで記述することもでき、そのファイルは配列として設定を返します:

```php
<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];
```

設定ファイル内で同じキーを持つ要素が現れた場合、それらは上書きされるか、[配列の場合はマージされます |#マージ]。後からインクルードされるファイルは、前のファイルよりも高い優先度を持ちます。`includes` セクションが記載されているファイルは、その中でインクルードされるファイルよりも高い優先度を持ちます。


Search
======

DIコンテナへのサービスの自動追加は、作業を非常に快適にします。NetteはPresenterを自動的にコンテナに追加しますが、他のクラスも簡単に追加できます。

クラスを検索するディレクトリ(およびサブディレクトリ)を指定するだけです:

```neon
search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model
```

通常、すべてのクラスとインターフェースを追加したいわけではないため、それらをフィルタリングできます:

```neon
search:
	-	in: %appDir%/Forms

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

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

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


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

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

```neon
search:
	-	in: %appDir%
		exclude:
			files: ...
			classes: ...
			extends: ...
			implements: ...
```

すべてのサービスにタグを設定できます:

```neon
search:
	-	in: %appDir%
		tags: ...
```


マージ
===

複数の設定ファイルで同じキーを持つ要素が現れた場合、それらは上書きされるか、配列の場合はマージされます。後からインクルードされるファイルは、前のファイルよりも高い優先度を持ちます。

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>結果</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
	<td>
```neon
items:
	- 1
	- 2
	- 3
```
	</td>
</tr>
</table>

配列の場合、キー名の後に感嘆符を付けることでマージを防ぐことができます:

<table class=table>
<tr>
	<th width=33%>config1.neon</th>
	<th width=33%>config2.neon</th>
	<th>結果</th>
</tr>
<tr>
	<td>
```neon
items:
	- 1
	- 2
```
	</td>
	<td>
```neon
items!:
	- 3
```
	</td>
	<td>
```neon
items:
	- 3
```
	</td>
</tr>
</table>

{{maintitle: 依存性注入の設定}}

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