Как в Symfony2 добавить диспетчер сущностей Doctrine к пользовательскому классу или сервису?
Я пробовал $em = $this->get("doctrine.orm.entity_manager"); и $em = $this->getDoctrine()->getEntityManager();
Оба потерпели неудачу, что побудило меня попытаться расширить класс Controller с помощью моего пользовательского класса / службы, и тот погиб в гигантском огненном шаре.
Ответ 1 · рейтинг 7 · Steven Mercatante
Вам необходимо внедрить службу диспетчера сущностей в свою настраиваемую службу. Ваше определение службы должно выглядеть так:
my.service.name:
class: my\class
arguments: [ @doctrine.orm.default_entity_manager ]
Убедитесь, что метод __construct вашей службы принимает в качестве аргумента диспетчер сущностей.
Дополнительную информацию см. В главе о контейнерах служб.
Кстати, $this->getDoctrine() - это метод быстрого доступа, который будет работать только в классе, расширяющем Symfony\Bundle\FrameworkBundle\Controller\Controller
Ответ 2 · рейтинг 8 · dylan oliver
Вам не нужно определять свой контроллер как службу, чтобы получить доступ к EntityManager. Упомянутый выше метод Controller::getDoctrine() просто возвращает реестр доктрины, вызывая $this->container->get('doctrine') после проверки того, что служба доктрины действительно доступна.
Просто сделайте свой собственный класс / контроллер расширением ContainerAware и определите метод быстрого доступа, например:
public function getEntityManager() {
return $this->container->get('doctrine')->getEntityManager();
}
Обратите внимание, что это $this->container->get(..), а не $this->get(..) в классе, расширяющем / реализующем ContainerAware.