web-dev-qa-db-ja.com

Symfony2でEntityManagerを使用する場合

現在、Symfony2の使い方を学んでいます。彼らがDoctrineの使い方を説明するところまで来ました。

与えられた例では、エンティティマネージャを使用することがあります。

$em = $this->getDoctrine()->getEntityManager();
$products = $em->getRepository('AcmeStoreBundle:Product')
        ->findAllOrderedByName();

他の例では、エンティティマネージャは使用されていません。

$product = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product')
        ->find($id);

だから私は実際にエンティティマネージャーを取得せずに最初の例を試しました:

$repository = $this->getDoctrine()
        ->getRepository('AcmeStoreBundle:Product');
$products = $repository->findAllOrderedByName();

同じ結果が得られました。

では、実際にエンティティマネージャが必要になるのはいつですか。また、一度にリポジトリにアクセスしてもよいのはいつですか。

15
Mats Rietdijk

ControllergetDoctrine()$this->get('doctrine')に等しく、 _Symfony\Bundle\DoctrineBundle\Registry_ のインスタンスです。レジストリは以下を提供します:

したがって、$this->getDoctrine()->getRepository()$this->getDoctrine()->getEntityManager()->getRepository()と等しくなります。

エンティティマネージャは、エンティティを永続化または削除する場合に役立ちます。

_$em = $this->getDoctrine()->getEntityManager();

$em->persist($myEntity);
$em->flush();
_

データをフェッチするだけの場合は、リポジトリのみを取得できます。

_$repository = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product');
$product    = $repository->find(1);
_

または、カスタムリポジトリを使用している場合は、IDEから自動完了機能を取得できるため、getRepository()をコントローラー関数でラップします。

_/**
 * @return \Acme\HelloBundle\Repository\ProductRepository
 */
protected function getProductRepository()
{
    return $this->getDoctrine()->getRepository('AcmeHelloBundle:Product');
}
_
29
gremo

getDoctrine()->getRepository()は単にgetDoctrine()->getEntityManager()->getRepository()へのショートカットだと思います。ソースコードをチェックしませんでしたが、私にはかなり合理的に聞こえます。

2

エンティティマネージャで複数の操作(リポジトリの取得、エンティティの永続化、フラッシュなど)を実行する場合は、最初にエンティティマネージャを取得して、変数に格納します。それ以外の場合は、エンティティマネージャからリポジトリを取得し、リポジトリクラスで必要なメソッドをすべて1行で呼び出すことができます。どちらの方法でも機能します。それはコーディングスタイルとあなたのニーズの問題です。

0
Haig Bedrosian