15

現在、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();

そして同じ結果を得ました。

では、実際にエンティティ マネージャーが必要になるのはいつで、一度にリポジトリに移動してもよいのはいつですか?

4

3 に答える 3

29

equals を見ると、 のインスタンスです。レジストリは以下を提供します:Controller getDoctrine()$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);

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

/**
 * @return \Acme\HelloBundle\Repository\ProductRepository
 */
protected function getProductRepository()
{
    return $this->getDoctrine()->getRepository('AcmeHelloBundle:Product');
}
于 2012-08-07T13:40:34.483 に答える
2

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

于 2012-08-07T13:16:32.563 に答える
0

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

于 2014-08-30T16:04:38.287 に答える