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が担当します。

バージョン: 3.x