Когда использовать Entity Manager в Symfony2


В данный момент я учусь использовать Symfony2. Я дошел до того, что они объясняют, как использовать доктрину.

В приведенных примерах они иногда используют entity manager:

$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();

И получил те же результаты.

Итак, когда мне действительно нужен менеджер сущностей и когда можно просто пойти на хранилище сразу же?

3 15

3 ответа:

Глядя на 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');
}

Я думаю, что getDoctrine()->getRepository() - это просто ярлык для getDoctrine()->getEntityManager()->getRepository(). Не проверял исходный код, но звучит довольно разумно для меня.

Если вы планируете выполнить несколько операций с менеджером сущностей (например, получить репозиторий, сохранить сущность, очистить и т. д.), то сначала получите менеджер сущностей и сохраните его в переменной. В противном случае, вы можете получить репозиторий из диспетчера сущностей и вызвать любой метод, который вы хотите в классе репозитория все в одной строке. Оба способа будут работать. Это просто вопрос стиля кодирования и ваших потребностей.