質問

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 依存関係の注入.

他のヒント

ベン・ショルツェン(@DASPRiD) には、彼自身の DI 疑似フレームワークの例があります。 ソースコード 彼のブログのために。彼は永続化のためにカスタム マッパーを使用し、それをサービスのインスタンス化時に各サービスに渡します。しかし、代わりに Doctrine2 EntityManager インスタンスを受け入れるように簡単に変更できるようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top