Когда использовать 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 ответа:
Глядя на
ControllergetDoctrine()равно$this->get('doctrine'), экземплярSymfony\Bundle\DoctrineBundle\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'); }
Я думаю, что
getDoctrine()->getRepository()- это просто ярлык дляgetDoctrine()->getEntityManager()->getRepository(). Не проверял исходный код, но звучит довольно разумно для меня.
Если вы планируете выполнить несколько операций с менеджером сущностей (например, получить репозиторий, сохранить сущность, очистить и т. д.), то сначала получите менеджер сущностей и сохраните его в переменной. В противном случае, вы можете получить репозиторий из диспетчера сущностей и вызвать любой метод, который вы хотите в классе репозитория все в одной строке. Оба способа будут работать. Это просто вопрос стиля кодирования и ваших потребностей.