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

查看等于 的一个实例。注册表提供: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

如果您计划对实体管理器执行多项操作(例如获取存储库、持久化实体、刷新等),则首先获取实体管理器并将其存储在变量中。否则,您可以从实体管理器获取存储库,并在一行中调用存储库类上所需的任何方法。两种方式都会奏效。这只是编码风格和您的需求的问题。

于 2014-08-30T16:04:38.287 回答