Когда использовать Entity Manager в Symfony2
На данный момент я изучаю, как использовать Symfony2. Я дошел до того, что они объясняют, как использовать Доктрину.
В приведенных примерах они иногда используют диспетчер сущностей:
$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();
и получили те же результаты.
Итак, когда мне действительно нужен диспетчер сущностей, и когда все в порядке, просто зайдите в репозиторий сразу?
Ответы
Ответ 1
Глядя на 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');
}
Ответ 2
Я думаю, что getDoctrine()->getRepository()
является просто ярлыком для getDoctrine()->getEntityManager()->getRepository()
. Не проверял исходный код, но звучит довольно разумно для меня.
Ответ 3
Если вы планируете выполнять несколько операций с менеджером сущностей (например, получить репозиторий, сохранить объект, флеш и т.д.), затем сначала получить диспетчер сущности и сохранить его в переменной. В противном случае вы можете получить репозиторий из диспетчера сущностей и вызывать любой метод, который вы хотите, в классе репозитория, все в одной строке. Оба способа будут работать. Это просто вопрос стиля кодирования и ваших потребностей.