2011-11-05 15 views
5

W Symfony2, w jaki sposób mogę dodać menedżera encji Doctrine do niestandardowej klasy lub usługi?Jak dodać Menedżera jednostek do niestandardowej klasy lub usługi?

Próbowałem $em = $this->get("doctrine.orm.entity_manager"); i $em = $this->getDoctrine()->getEntityManager();

Zarówno niepowodzeniem, co doprowadziło mnie do spróbować rozszerzyć klasę kontrolera z mojej klasy niestandardowe/usługi, a zmarł w gigantycznej kuli ognia.

Odpowiedz

7

Należy wprowadzić usługę menedżera encji do niestandardowej usługi. Twoja definicja usługa powinna wyglądać następująco:

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

Upewnij się, że __construct sposób swoją usługę zabiera kierownika jednostki jako argument.

Aby uzyskać więcej informacji, patrz Service Container chapter.

BTW, $this->getDoctrine() jest skrótem metoda, która działa tylko w klasie, która rozciąga Symfony\Bundle\FrameworkBundle\Controller\Controller

+0

W Symfony 2.3 używam "@ doctrine.orm.entity_manager". Czy istnieje różnica między "@ doctrine.orm.entity_manager" a "@ doctrine.orm.default_entity_manager"? –

8

Robisz nie zdefiniować kontroler jako usługi w celu uzyskania dostępu do EntityManager. Wymieniona wyżej metoda Controller::getDoctrine() po prostu zwraca Rejestr Doktryny, wywołując $this->container->get('doctrine') po sprawdzeniu, czy usługa doktrynalna jest rzeczywiście dostępna.

Wystarczy dokonać zwyczaj klasa/kontroler przedłużyć ContainerAware i zdefiniować metodę skrótu jak:

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

Należy pamiętać, że jest to $this->container->get(..) i nie $this->get(..) w klasie powiększenia/realizacji ContainerAware.

+0

Fantastyczny punkt na rozszerzenie 'ContainerAware', dziękuję! – Nick

+0

Działa jak urok! Dziękuję kolego :) – Marc

+0

Otrzymuję "Wezwanie do funkcji członkowskiej get() na non-object w ..." przy użyciu powyższej metody. – someuser

Powiązane problemy