Nette Documentation Preview

syntax
ネッテDIコンテナ
*********

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

DIコンテナで作成するサービスは、通常、[NEON |neon:en: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が自動的にコンテナを再生成します。そこで、純粋にアプリケーションの開発に集中することができます。

もし、セッターを使って依存関係を渡したい場合は、[セットアップ |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]見ることができます。


スタンドアローンでの使用 .[#toc-standalone-use]
-----------------------------------

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
$database = $container->getByType(UserController::class);
$database->query('...');
```

開発時には、オートリフレッシュモードを有効にしておくと便利です。このモードでは、クラスや設定ファイルが変更されると、コンテナが自動的に再生成されます。`ContainerLoader` のコンストラクタの第2引数として`true` を指定するだけです。

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


Netteフレームワークで使用する .[#toc-using-it-with-the-nette-framework]
-----------------------------------------------------------

これまで紹介したように、Nette DI の利用は Nette Framework で書かれたアプリケーションに限らず、たった3行のコードでどこにでも展開することができます。
ただし、Nette Frameworkでアプリケーションを開発する場合、コンテナの設定や作成は[Bootstrapが |application:en:bootstrap#toc-di-container-configuration]担当します。

ネッテ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

表記は実に簡潔である。

ArticleFactoryUserController クラスのコンストラクタで宣言された依存関係は、いわゆる自動配線によって Nette DI 自身が見つけて渡すので、設定ファイルに何も指定する必要がありません。 そのため、パラメータが変更されても、設定を何も変更する必要はありません。Netteが自動的にコンテナを再生成します。そこで、純粋にアプリケーションの開発に集中することができます。

もし、セッターを使って依存関係を渡したい場合は、セットアップセクションを使用してください。

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 オブジェクトを作成します。

$database = $container->getByType(UserController::class);
$database->query('...');

開発時には、オートリフレッシュモードを有効にしておくと便利です。このモードでは、クラスや設定ファイルが変更されると、コンテナが自動的に再生成されます。ContainerLoader のコンストラクタの第2引数としてtrue を指定するだけです。

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

Netteフレームワークで使用する

これまで紹介したように、Nette DI の利用は Nette Framework で書かれたアプリケーションに限らず、たった3行のコードでどこにでも展開することができます。 ただし、Nette Frameworkでアプリケーションを開発する場合、コンテナの設定や作成はBootstrapが担当します。