依存性の注入コンテナ (DIC) は、アプリケーションの依存関係を管理する強力なツールであります。これは、現代のPHPフレームワークで重要な概念であり、オブジェクトのインスタンス化と構成を管理するために使用されます。DIC ライブラリの例には次のものがあります: Dice, Pimple, PHP-DI, および league/container。
DIC とは、クラスを中央集権的に作成および管理できるという洒落た方法です。これは、同じオブジェクトを複数のクラス (たとえば、コントローラー) に渡す必要がある場合に役立ちます。簡単な例は、この概念を理解するのに役立つでしょう。
昔は以下のように行っていたかもしれません:
// 以前の方法
以上のコードからわかるように、新しい PDO オブジェクトを作成して UserController クラスに渡しています。これは小規模なアプリケーションには適していますが、アプリケーションが成長すると、同じ PDO オブジェクトを複数箇所で作成していることがわかります。ここで DIC が役立ちます。
PDO
UserController
こちらは (Dice を使用した) DIC を使用して同じ例を示したものです:
// DIC を使用した同じ例
もしかすると、この例には多くの余分なコードが追加されたと思っているかもしれません。その魔法は、PDO オブジェクトが必要な別のコントローラーを持っている場合に来ます。
// 他のコントローラーが PDO オブジェクトが必要な場合
DIC を利用することの追加メリットは、ユニットテストがはるかに容易になることです。モックオブジェクトを作成してクラスに渡すことができます。これは、アプリケーションのテストを書く際に非常に有益です!
Flight は PSR-11 に準拠したコンテナも利用できます。これは、PSR-11 インターフェースを実装した任意のコンテナを使用できることを意味します。以下は、League の PSR-11 コンテナを使用した例です:
// PSR-11 コンテナを使用した例
この Dice の例よりも少し冗長かもしれませんが、同じ利点を持って問題なく機能します!
独自の DIC ハンドラも作成することができます。これは、PSR-11 ではないカスタムコンテナを使用したい場合に役立ちます。これを行う方法についての詳細については、基本的な例を参照してください。
さらに、Flight の使用時に生活をより簡単にするためのいくつかの便利なデフォルトがあります。
コントローラー/ミドルウェアで Engine インスタンスを使用する場合、以下のように構成できます:
Engine
// エンジンインスタンスを使用する方法
コンテナに追加したい他のクラスがある場合、Dice を使用すると自動的に解決されます。以下は例です:
// 他のクラスの追加