Когда использовать 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 ответа:
Глядя на
Controller
getDoctrine()
равно$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()
. Не проверял исходный код, но звучит довольно разумно для меня.
Если вы планируете выполнить несколько операций с менеджером сущностей (например, получить репозиторий, сохранить сущность, очистить и т. д.), то сначала получите менеджер сущностей и сохраните его в переменной. В противном случае, вы можете получить репозиторий из диспетчера сущностей и вызвать любой метод, который вы хотите в классе репозитория все в одной строке. Оба способа будут работать. Это просто вопрос стиля кодирования и ваших потребностей.