2016-11-14 8 views
2

私は、複数のエンティティ・リポジトリに依存するサービス・クラスを持っています(例えば、4)。
それぞれのリポジトリを注入して多くの依存性を持つことができます。単一の依存関係としてのエンティティマネージャ。 EntityManager->getRepo('xyz')に依存しています。依存関係の導入 - Doctrine:複数のリポジトリと単一のエンティティ・マネージャ

独立した依存関係は、コードヒントの利点があります。

単一従属性は、構築時にあまり冗長ではありません。
おそらく簡単に嘲笑して設定するのは簡単でしょうか?

より良い方法とは何でしょうか?

+0

リポジトリ注入などのphpdocのアノテーションでそれを行うことができますがダウンして手を獲得します。本当の問題は、4つのリポジトリに依存するクラスが多すぎる可能性が高いことです。 – Cerad

+0

私はそれが過度に思われることに同意します。しかし、おそらく、reposのいくつかは、formElement、formElementOption、formElementFilterなどの組み合わせでマージする必要があるかもしれません。だから、その多くは正規化されている可能性があります。しかし、私はコメントに感謝します。 – mr12086

答えて

3

この場合、EntityManagerはService Locatorのようなものです。サービスがEntityManagerに依存する場合、サービスはすべてのAPIおよびすべての関連オブジェクト(リポジトリ、メタデータなど)にも正式に依存します。本当に必要なものだけを注入してください。 特定のリポジトリを明示的に注入すると、サービスの読み込みとテストがより簡単になります。

また、可能であれば、クラスに対するインタフェースを優先してください(EntityManagerの代わりにObjectManager、EntityManagerの代わりにObjectManager)。

2

あなたのサービスの依存関係でDoctrine Entity Managerを1つだけ使用する必要があります。 しかし、あなたはあなたのIDEでコードヒントを持つようにしたい場合は、あなたがこの

class SomeServiceWithDoctrineDependency 
{ 
    /** @var YourFirstObjectRepository */ 
    protected $firstRepo; 
    /** @var YourSecondObjectRepository */ 
    protected $secondRepo; 
    /** @var YourThirdObjectRepository */ 
    protected $thirdRepo; 

    public function __construct(EntityManagerInterface $entityManager) 
    { 
     $this->firstRepo = $entityManager->getRepository('First:Repo'); 
     $this->secondRepo = $entityManager->getRepository('Second:Repo'); 
     $this->thirdRepo = $entityManager->getRepository('Third:Repo'); 
    } 

    public function getCodeHint() 
    { 
     // You get hint here for find method 
     // $this->thirdRepo()->find()... 
    } 
} 
関連する問題