Doctrine 2 を活用する Zend Framework プロジェクトに取り組んでいます。Symfony の DI コンテナをプロジェクトでも動作させようとしていますが、問題が発生しています。2 つのインスタンスを注入する必要があるクラス "Foo" があるとします。Symfony DI コンテナーをセットアップして、依存関係が注入された新しい "Foo" を問題なく取得できます。すごい!しかし、「Foo」を Doctrine エンティティにしたい場合はどうすればよいでしょうか? エンティティをDBに挿入すると、DIコンテナから新しいエンティティを取得してエンティティを永続化できるため、すべて問題ありません。ただし、DB Doctrine からエンティティをクエリすると、「Foo」インスタンスがインスタンス化され、適切な依存関係が注入されません。エンティティが適切な依存関係を持つように、Doctrine に私の DI コンテナーを使用させるにはどうすればよいですか? Doctrine が "postLoad" フックを提供しており、それを使用してエンティティに依存関係を注入できることは知っていますが、そのようなものは DI コンテナーの目的と利点を無効にします。
2 に答える
Doctrine Entity は注入可能ではなく、newable です。DIC を使用してエンティティを作成することは想定されていません。newable と injectable の違いについては、次のブログ投稿を参照してください。
少しトリッキーですが、実行できます。symfony di コンテナー用のパッチが存在します。これにより、既存のオブジェクトをコンテナー ビルダー インスタンスに渡し、di コンテナーにそれを構成させることができます (たとえば、インターフェイスに基づいて依存関係を注入します)。パッチは github のリポジトリ ( https://github.com/lstrojny/symfony ) に実装されていますが、symfony マスター リポジトリのアップストリームにはなりませんでした。
次のように使用します。
$user = new User();
$container->configure('someId', $user);
次に、PostLoad イベント ハンドラーを Doctrine の EventManager に登録できます (詳細については、こちらを参照してください: http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html )。このイベント ハンドラーでは、前述のメソッドを使用して、読み込まれたエンティティを構成します。明らかですが、この場合はコンストラクター注入を使用できません。セッターのみです。
これはセットアップが少し難しいですが、特にインターフェースに基づいて依存関係を注入する symfony di コンテナーの機能と組み合わせると、非常に強力になります。