Nette Documentation Preview

syntax
Nette DIコンテナ
************

.[perex]
Nette DIは、Netteの最も興味深いライブラリの1つです。非常に高速で驚くほど簡単に構成できるコンパイル済みDIコンテナを生成および自動更新できます。

DIコンテナが作成するサービスの形式は、通常、[NEONフォーマット|neon:format]の構成ファイルを使用して定義します。[前の章|container]で手動で作成したコンテナは、次のように記述されます:

```neon
parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController
```

記述は本当に簡潔です。

`ArticleFactory` および `UserController` クラスのコンストラクタで宣言されたすべての依存関係は、いわゆる[オートワイヤリング|autowiring]のおかげでNette DIによって自動的に検出され、渡されるため、構成ファイルに何も指定する必要はありません。したがって、パラメータが変更された場合でも、構成で何も変更する必要はありません。Netteコンテナは自動的に再生成されます。アプリケーションの開発に集中できます。

セッターを使用して依存関係を渡したい場合は、[setup |services#Setup]セクションを使用します。

Nette DIは、コンテナのPHPコードを直接生成します。結果は`.php`ファイルであり、開いて調べることができます。これにより、コンテナがどのように機能するかを正確に確認できます。IDEでデバッグしてステップ実行することもできます。そして最も重要なこと:生成されたPHPは非常に高速です。

Nette DIは、提供されたインターフェースに基づいて[ファクトリ|factory]のコードを生成することもできます。したがって、`ArticleFactory` クラスの代わりに、アプリケーションでインターフェースを作成するだけで十分です:

```php
interface ArticleFactory
{
	function create(): Article;
}
```

完全な例は[GitHub上|https://github.com/nette-examples/di-example-doc]にあります。


スタンドアロンでの使用
-----------

Nette DIライブラリをアプリケーションに導入するのは非常に簡単です。まず、Composerでインストールします(zipファイルのダウンロードは時代遅れなので):

```shell
composer require nette/di
```

次のコードは、`config.neon`ファイルに保存された構成に従ってDIコンテナのインスタンスを作成します:

```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;
```

コンテナは一度だけ生成され、そのコードはキャッシュ(ディレクトリ`__DIR__ . '/temp'`)に書き込まれ、後続のリクエストではそこから読み込まれるだけです。

サービスを作成および取得するには、サービス名をパラメータとして`getService()`メソッドを使用するか、サービスタイプをパラメータとして`getByType()`メソッドを使用します。このようにして`UserController`オブジェクトを作成します:

```php
$controller = $container->getByType(UserController::class);
$controller->someMethod();
```

開発中は、自動更新モードを有効にすると便利です。これにより、クラスまたは構成ファイルが変更されると、コンテナが自動的に再生成されます。`ContainerLoader`のコンストラクタで2番目の引数として`true`を指定するだけです。

```php
$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);
```


Netteフレームワークでの使用
----------------

示したように、Nette DIの使用はNette Frameworkで書かれたアプリケーションに限定されず、わずか3行のコードでどこにでも展開できます。 ただし、Nette Frameworkでアプリケーションを開発している場合、コンテナの構成と作成は[Bootstrap |application:bootstrapping#DIコンテナの設定]が担当します。

Nette DIコンテナ

Nette DIは、Netteの最も興味深いライブラリの1つです。非常に高速で驚くほど簡単に構成できるコンパイル済みDIコンテナを生成および自動更新できます。

DIコンテナが作成するサービスの形式は、通常、NEONフォーマットの構成ファイルを使用して定義します。前の章で手動で作成したコンテナは、次のように記述されます:

parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController

記述は本当に簡潔です。

ArticleFactory および UserController クラスのコンストラクタで宣言されたすべての依存関係は、いわゆるオートワイヤリングのおかげでNette DIによって自動的に検出され、渡されるため、構成ファイルに何も指定する必要はありません。したがって、パラメータが変更された場合でも、構成で何も変更する必要はありません。Netteコンテナは自動的に再生成されます。アプリケーションの開発に集中できます。

セッターを使用して依存関係を渡したい場合は、setupセクションを使用します。

Nette DIは、コンテナのPHPコードを直接生成します。結果は.phpファイルであり、開いて調べることができます。これにより、コンテナがどのように機能するかを正確に確認できます。IDEでデバッグしてステップ実行することもできます。そして最も重要なこと:生成されたPHPは非常に高速です。

Nette DIは、提供されたインターフェースに基づいてファクトリのコードを生成することもできます。したがって、ArticleFactory クラスの代わりに、アプリケーションでインターフェースを作成するだけで十分です:

interface ArticleFactory
{
	function create(): Article;
}

完全な例はGitHub上にあります。

スタンドアロンでの使用

Nette DIライブラリをアプリケーションに導入するのは非常に簡単です。まず、Composerでインストールします(zipファイルのダウンロードは時代遅れなので):

composer require nette/di

次のコードは、config.neonファイルに保存された構成に従ってDIコンテナのインスタンスを作成します:

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;

コンテナは一度だけ生成され、そのコードはキャッシュ(ディレクトリ__DIR__ . '/temp')に書き込まれ、後続のリクエストではそこから読み込まれるだけです。

サービスを作成および取得するには、サービス名をパラメータとしてgetService()メソッドを使用するか、サービスタイプをパラメータとしてgetByType()メソッドを使用します。このようにしてUserControllerオブジェクトを作成します:

$controller = $container->getByType(UserController::class);
$controller->someMethod();

開発中は、自動更新モードを有効にすると便利です。これにより、クラスまたは構成ファイルが変更されると、コンテナが自動的に再生成されます。ContainerLoaderのコンストラクタで2番目の引数としてtrueを指定するだけです。

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);

Netteフレームワークでの使用

示したように、Nette DIの使用はNette Frameworkで書かれたアプリケーションに限定されず、わずか3行のコードでどこにでも展開できます。 ただし、Nette Frameworkでアプリケーションを開発している場合、コンテナの構成と作成はBootstrapが担当します。