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

version: 3.x