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