2012-08-08 10 views
5

podemos acceder gestor de la entidad dentro del controlador usando $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');ZF2 cómo conseguir gestor de la entidad desde fuera del controlador

pero ¿cómo podemos acceder entidad instancia del gestor de producto único en el resto del proyecto en ZendFramework 2.

+0

Solo una pregunta, ya que estás hablando de Doctrine ORM, ¿tienes problemas para bajar el entityManager a tus niveles de fieldset? :) – Sam

Respuesta

12

El ' La forma correcta de hacerlo es utilizar una fábrica para inyectar el administrador de entidades en cualquier clase que lo necesite. Las clases, que no sean fábricas, no deberían estar realmente al tanto del ServiceLocator. Por lo tanto, su configuración del módulo se vería así:

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

Luego, su clase de fábrica sería algo como esto:

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; 
    } 
} 

Siga el mismo patrón para otras clases que necesitan para consumir el gestor de la entidad.

Si tiene muchas clases que consumen el administrador de entidades, puede considerar agregar su propio Initalizer al SerivceManager que inyectará el administrador de entidades sin la necesidad de una fábrica.

+0

Me gusta su última sugerencia. Puede crear un 'EntityManagerAwareInterface' y hacer que el ServiceLocator lo inyecte automáticamente a cualquier clase que lo implemente. Creo que mencionan esto en el README de la página doctrine-orm-module hasta el final en la parte inferior. Viene pronto. –

+0

Sí, quiere tener cuidado con Initalizers: se ejecutan cada vez que se obtiene un objeto del ServiceManager. Si apilas el ServiceManager con Initalizers que no se usan mucho, estás reduciendo la velocidad de las cosas, por lo que solo sugiero que se necesite el administrador de entidades en muchas clases. – superdweebie

+0

buen punto en ese comentario de rendimiento. Gracias por ayudarme a ver eso. –

Cuestiones relacionadas