MVC アプリでの依存関係の挿入に関するヘルプ
質問
Zend Framework/Doctrine 2 アプリケーション:
/app
/modules
/blog
/controllers
/BlogController.php
/domain
/entities
/services
/PostService.php
/repositories
PostService は基本的な CRUD 操作を担当し、エンティティと EntityManager を直接処理して、ビジネス ロジックと永続化ロジックをコントローラーから抽象化します。
可能であれば、サービスをPOPOとして維持したいと考えています。サービス クラスで EntityManager にアクセス/挿入する最良の方法は何ですか?DIは初めてなので、この質問です。EntityManager は、コントローラーのブートストラップ リソースとしてアクセスできます。
EntityManager にアクセスするサービスの抽象クラスを記述するだけでよいでしょうか?コンストラクター/セッターを介して EntityManager を注入して、サービスをインスタンス化するクラスを作成する必要がありますか?...これには、私のサービスのインターフェースが関係します。DI フレームワークを使用する必要がありますか?もしそうなら、どれをどのようにして?
それとも、これを行うための別のより良い方法はありますか?
私は依存性注入について読みましたが、この文脈ではまだ完全には理解していません。
更新 (2011 年 1 月 12 日)
したがって、これが私の現在の作業ソリューションです。Resource というアクション ヘルパーがあります。これはブートストラップからリソースを取得するためのヘルパーです。または、リソースを手動で追加することもできます。 http://pastie.org/1450851
$this->_helper->Resource('em'); // get EntityManager
ブートストラップ リソースをヘルパー クラス内でローカルに保存することによるパフォーマンスへの影響について、誰かが洞察を提供していただけますか?やりすぎでしょうか?
TODO:resourceMap をクラスからリファクタリングします。
そして、サービスをロードするためのアクションヘルパーがあります。 http://pastie.org/1450855
TODO:サービスをロードする前にチェックを追加します。
上記についていくつかの批判をしてください:)
解決
サービス層をアプリケーションの残りの部分から分離しておくために、私は多くの場合、コントローラーに依存してインジェクションを処理します。まだ DI コンテナを分解して使用することはできませんが、リソース インジェクターについて説明しました。 ここ アプリケーションに EntityManager を渡すのに最適です。
EntityManager はブートストラップ上でリソースとしてインスタンス化され、コントローラーが要求した場合、ActionHelper がそれをコントローラーに追加します。次に、コンストラクター インジェクションまたはセッター インジェクションを使用して、それをサービス オブジェクトに渡します。
class MyController extends Zend_Action_Controller
{
// A little different from O'Phinney's implementation. I'm adding
// the resource named 'entitymanager' as the public property $em.
public $dependencies = array(
'entitymanager' => 'em'
);
public function myAction()
{
$service = new MyService($this->em);
// or...
$service = new MyService();
$service->setEntityManager($em);
}
}
というインターフェイスを使用しています IHasEntityManager
同じように。
コントローラーに Service オブジェクトの構築を担当させたくない場合は、次のような DI コンテナを検討するとよいでしょう。 Symfony 依存関係の注入.