20

Symfony 2 のベスト プラクティスについて質問があります。あいまいで主観的でしたら申し訳ありません。私の質問を次のように要約できると思います。

「リポジトリは常にクエリに適した場所ですか?」.

現在、ほとんどのドクトリン クエリをエンティティ リポジトリに入れています。私のコントローラーアクションのほとんどは、エンティティまたはエンティティのコレクションのクエリ、その結果に応じた例外のスローまたはリダイレクト、または 1 つ以上のエンティティの更新などの典型的なことを行います。ほとんどのアクションは、標準の ->find、->findBy などのクエリで効率的に実行できるよりも複雑です。ほとんどの場合、結合が必要です。クエリに複数のエンティティが含まれる場合、どのリポジトリに入れればよいのかわからないことがあります。クエリのルート エンティティがあると思いますが、結合されたエンティティからのデータの方が重要で関連性が高いため、間違っていると感じることがあります。ルート エンティティのリポジトリに配置します。

それは問題なく機能していますが、私のリポジトリでは、ほぼ同じであるがわずかに異なるクエリが多数作成される傾向があります。名前を考えて、それぞれが何をするかを正確に追跡することは、混乱し、退屈になる可能性があります。これらのクエリのほとんどは、同じコントローラー内の 1 つまたは 2 つの (ほとんど使用されない) コントローラー アクションによってのみ使用されます。専門的でめったに使用されないものでリポジトリが雑然としているように感じます。

最も単純なアクション以外はすべて、オブジェクトまたはサービスにカプセル化する必要があるようです。そのため、リポジトリではなくサービスで直接多くのクエリを実行し始めました。アクションをすべて 1 か所で簡単に確認できます。これは大丈夫な練習ですか?

4

3 に答える 3

9

その間に何かをすることができます。

サービスを定義します。

blog.post_manager:
    class: Acme\BlogBundle\Entity\Manager\PostManager
    arguments:
        em: "@doctrine.orm.entity_manager"
        class: Acme\BlogBundle\Entity\Post

次に Manager クラスを作成します。

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;

class PostManager
{
    protected $em;

    protected $repo;

    protected $class;

    public function __construct(EntityManager $em, $class) {
        $this->em = $em;
        $this->class = $class;
        $this->repo = $em->getRepository($class);
    }

    public function get($id)
    {
        return $this->repo->findById($id);
    }
}

このようにして、リポジトリ内の所属する場所にクエリを残すことができますが、任意のコントローラーで次のように使用できるマネージャー サービスを介してコードを再利用できます。

$this->container->get('blog.post_manager')->get(1);

クラスとエンティティ マネージャーを Manager クラスに挿入するのはサービスによって処理されるため、これにより、コントローラーが薄く保たれ、モデルから離れてより適切に抽象化されます。

于 2013-06-13T15:12:45.783 に答える