現在、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();
同じ結果が得られました。
では、実際にエンティティマネージャが必要になるのはいつですか。また、一度にリポジトリにアクセスしてもよいのはいつですか。
Controller
getDoctrine()
は$this->get('doctrine')
に等しく、 _Symfony\Bundle\DoctrineBundle\Registry
_ のインスタンスです。レジストリは以下を提供します:
getEntityManager()
return _Doctrine\ORM\EntityManager
_ 、これによりgetRepository()
が提供されますgetRepository()
return _Doctrine\ORM\EntityRepository
_したがって、$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');
}
_
getDoctrine()->getRepository()
は単にgetDoctrine()->getEntityManager()->getRepository()
へのショートカットだと思います。ソースコードをチェックしませんでしたが、私にはかなり合理的に聞こえます。
エンティティマネージャで複数の操作(リポジトリの取得、エンティティの永続化、フラッシュなど)を実行する場合は、最初にエンティティマネージャを取得して、変数に格納します。それ以外の場合は、エンティティマネージャからリポジトリを取得し、リポジトリクラスで必要なメソッドをすべて1行で呼び出すことができます。どちらの方法でも機能します。それはコーディングスタイルとあなたのニーズの問題です。