目前我正在学习如何使用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();
并得到了相同的结果。
那么我什么时候才真正需要实体经理?什么时候可以立即去存储库?
答案 0 :(得分:29)
查看Controller
getDoctrine()
等于$this->get('doctrine')
,Symfony\Bundle\DoctrineBundle\Registry
的实例。 Registry提供:
getEntityManager()
返回Doctrine\ORM\EntityManager
,后者又提供getRepository()
getRepository()
返回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);
或者更好的是,如果您使用自定义存储库,请在控制器函数中包装getRepository()
,因为您可以从IDE获得自动完成功能:
/**
* @return \Acme\HelloBundle\Repository\ProductRepository
*/
protected function getProductRepository()
{
return $this->getDoctrine()->getRepository('AcmeHelloBundle:Product');
}
答案 1 :(得分:2)
我认为getDoctrine()->getRepository()
只是getDoctrine()->getEntityManager()->getRepository()
的捷径。没有检查源代码,但听起来对我来说相当合理。
答案 2 :(得分:0)
如果您打算使用实体管理器执行多个操作(例如获取存储库,保留实体,刷新等),则首先获取实体管理器并将其存储在变量中。否则,您可以从实体管理器获取存储库,并在一行中调用存储库类中所需的任何方法。两种方式都有效。这只是编码风格和需求的问题。