こんにちは。よっしーです(^^)
今日は、PHP-DIにおける既存インスタンスへのインジェクションについてご紹介します。
背景
PHP-DIに触れる機会がありましたので、PHP-DIにおける既存インスタンスへのインジェクションについて備忘として残しました。
詳細は下記の公式サイトをご覧ください。
はじめに
この機能は、PHP-DI 3.3で導入された機能です。
コンテナを使用する標準的な方法は、コンテナからオブジェクトを取得し、すべての依存関係を注入することです:
$object = $container->get('foo');
しかし、いくつかの状況では、オブジェクトの作成をコントロールできない場合もありますが、そのオブジェクトの依存関係を解決したいことがあります。
PHP-DIでは、injectOn
メソッドを提供しています:
// $objectはあるクラスのインスタンスです
$container->injectOn($object);
injectOn
メソッドを呼び出した後、$object
は依存関係がすべて注入された状態になります(セッターインジェクションとプロパティインジェクションの両方が行われます)。
コンストラクタのインジェクション
ただし、injectOn
メソッドを使用する際、PHP-DIはコンストラクタインジェクションは行いません(インスタンスは既に作成されているため)。もし自分でオブジェクトを作成する場合は、コンストラクタインジェクションを自分で行う必要があります:
$object = new MyClass($someDependency, $someOtherDependency);
$container->injectOn($object);
なお、コンテナからオブジェクトを取得することを推奨されていますが、「injectOn」メソッドを使用することで、オブジェクトの作成に直接制御が効かない状況でもPHP-DIの依存関係注入機能を統合する手段を提供しています。
例えば:
- SymfonyやZend FrameworkなどのMVCフレームワークでは、コントローラーの依存関係をコントローラー自体に注入するために「injectOn」を使用できます。
- PHPUnitなどのテストフレームワークでは、テストクラスにツールを注入するために、「injectOn」を使用できます。例えば、ロガーやタイマー(パフォーマンステスト用)やエンティティマネージャー(統合テスト用)を注入できます。
class MyController {
public function __construct() {
// コンテナを取得...
$container->injectOn($this);
}
}
もちろん、依然として$container->get()
メソッドを使用することが推奨されます。ただし、オブジェクトの作成を直接制御できない場合でも、「injectOn」メソッドを使用することで、PHP-DIの依存関係注入機能を統合することができます。
おわりに
今日は、PHP-DIにおける既存インスタンスへのインジェクションについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント