2012-08-08 5 views
5

wir EntityManager innerhalb Controller zugreifen können $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');ZF2 wie Entity-Manager von außerhalb des Controllers

aber wie können wir Zugriff auf Unternehmens-Manager Singleton-Instanz in Rest des Projekts in ZendFramework 2.

+0

Nur eine Frage, da Sie über das Doctrine-ORM sprechen, haben Sie Probleme, den EntityManager auf Ihre Fieldset-Level herabzusetzen? :) – Sam

Antwort

12

Die bekommen ' Der richtige Weg, dies zu tun, ist eine Fabrik zu verwenden, um den Entity Manager in jede Klasse zu injizieren, die sie benötigt. Klassen außer Fabriken sollten den ServiceLocator nicht wirklich kennen. So würde das Modul Config wie folgt aussehen:

'controllers' => array(
    'factories' => array(
      'mycontroller' => 'My\Namespace\MyControllerFactory' 
    ) 
) 

Dann Ihre Factory-Klasse wie folgt aussehen würde:

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class MyControllerFactory implements FactoryInterface 
{ 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $serviceLocator = $serviceLocator->getServiceLocator(); 

     $myController = new MyController; 
     $myController->setEntityManager(
      $serviceLocator->get('doctrine.entitymanager.orm_default') 
     ); 

     return $myController; 
    } 
} 

folgen dem gleichen Muster für alle anderen Klassen, die das Unternehmen Manager verbrauchen müssen.

Wenn Sie viele Entitäten verwenden, die den Entity Manager verwenden, sollten Sie in Erwägung ziehen, dem SerivceManager einen eigenen Initializer hinzuzufügen, der den Entity Manager injiziert, ohne dass eine Factory benötigt wird.

+0

Ich mag deinen letzten Vorschlag. Er kann ein 'EntityManagerAwareInterface' erstellen und den ServiceLocator automatisch in alle Klassen implementieren, die es implementieren. Ich denke, sie erwähnen das auf der README der Doktrin-Orm-Modul-Seite ganz unten. Es kommt bald. –

+0

Ja, Sie möchten mit Initalisierern vorsichtig sein - sie werden jedes Mal ausgeführt, wenn ein Objekt vom ServiceManager abgerufen wird. Wenn Sie den ServiceManager mit Initializern stapeln, die nicht oft verwendet werden, verlangsamen Sie nur die Dinge, weshalb ich es nur vorschlage, wenn der Entity Manager in vielen Klassen benötigt wird. – superdweebie

+0

guter Punkt auf diesen Kommentar zur Leistung. Danke, dass du mir geholfen hast, das zu sehen. –