Как я могу добавить Entity Manager в настраиваемый класс или службу?

Как в Symfony2 добавить диспетчер сущностей Doctrine к пользовательскому классу или сервису?

Я пробовал $em = $this->get("doctrine.orm.entity_manager"); и $em = $this->getDoctrine()->getEntityManager();

Оба потерпели неудачу, что побудило меня попытаться расширить класс Controller с помощью моего пользовательского класса / службы, и тот погиб в гигантском огненном шаре.


person Nick    schedule 05.11.2011    source источник


Ответы (2)


Вам необходимо внедрить службу диспетчера сущностей в свою настраиваемую службу. Ваше определение службы должно выглядеть так:

my.service.name:
  class:     my\class
  arguments: [ @doctrine.orm.default_entity_manager ]

Убедитесь, что метод __construct вашей службы принимает в качестве аргумента диспетчер сущностей.

Дополнительную информацию см. В главе о контейнерах служб.

Кстати, $this->getDoctrine() - это метод быстрого доступа, который будет работать только в классе, расширяющем Symfony\Bundle\FrameworkBundle\Controller\Controller

person Steven Mercatante    schedule 05.11.2011
comment
В Symfony 2.3 я использую @ doctrine.orm.entity_manager. Есть ли разница между @ doctrine.orm.entity_manager и @ doctrine.orm.default_entity_manager? - person Jay Sheth; 22.03.2014

Вам не нужно определять свой контроллер как службу, чтобы получить доступ к EntityManager. Упомянутый выше метод Controller::getDoctrine() просто возвращает реестр доктрины, вызывая $this->container->get('doctrine') после проверки того, что служба доктрины действительно доступна.

Просто сделайте свой собственный класс / контроллер расширением ContainerAware и определите метод быстрого доступа, например:

public function getEntityManager() {
    return $this->container->get('doctrine')->getEntityManager();
}

Обратите внимание, что это $this->container->get(..), а не $this->get(..) в классе, расширяющем / реализующем ContainerAware.

person dylan oliver    schedule 05.11.2011
comment
Работает как шарм! Спасибо тебе, друг :) - person Marc; 21.03.2013
comment
Я получаю вызов функции-члена get () для не-объекта в ... при использовании вышеуказанного метода. - person someuser; 13.04.2013
comment
вы продлеваете ContainerAware? - person dylan oliver; 15.04.2013
comment
Где ContainerAware? - person Nigel Angel; 28.03.2014