ZF2 y EntityManager(Doctrine)
zend-framework2 (2)
Su verdadera pregunta es " Cómo obtener una Instancia de ServiceManager en mis propias clases "
Para esto, eche un vistazo a la documentación: (al pie de la página http://zf2.readthedocs.org/en/latest/modules/zend.service-manager.quick-start.html )
Por defecto, Zend Framework MVC registra un inicializador que inyectará la instancia de ServiceManager, que es una implementación de Zend / ServiceManager / ServiceLocatorInterface, en cualquier clase que implemente Zend / ServiceManager / ServiceLocatorAwareInterface. Una implementación simple se parece a lo siguiente.
así que implemente ServiceLocatorInterface en sus clases y luego dentro de su clase puede llamar:
$this->getServiceLocator()->get(''doctrine.entitymanager.orm_default'');
o cualquier otro servicio que haya registrado.
Tengo un problema. Intento obtener el Entity-Manager sin un Controller, pero no encontré la manera. En este momento, obtengo el Entity-Manager así:
(Controller)
public function getEntityManager()
{
if (null === $this->_em) {
$this->_em = $this->getServiceLocator()->get(''Doctrine/ORM/EntityManager'');
}
return $this->_em;
}
(Plugin)
public function getEntityManager()
{
if($this->_em == null){
$this->_em = $this->getController()->getServiceLocator()->get(''doctrine.entitymanager.orm_default'');
}
return $this->_em;
}
Ya ves, necesito siempre un controlador. Pero, si necesito EntityManager en un modelo, tengo un problema. Puedo darle al modelo el controlador, pero creo que esto es realmente una mala manera.
¿Tiene alguna idea de obtener el EntityManager sin un controlador?
La forma en que manejo Doctrine es a través de Servicios, lo hago de la siguiente manera:
//some Controller
public function someAction()
{
$service = $this->getServiceLocator()->get(''my_entity_service'');
return new ViewModel(array(
''entities'' => $service->findAll()
));
}
El servicio- Service->findAll()
se vería así:
public function findAll()
{
return $this->getEntityRepository()->findAll();
}
Ahora tenemos que definir el my_entity_service
. Hago esto dentro de mi Module.php
public function getServiceConfig()
{
return array(
''factories'' => array(
''my_entity_service'' => ''Namespace/Factory/MyServiceFactory''
)
);
}
A continuación, creo la fábrica (nota: esto también podría hacerse a través de una función anónima dentro de Module.php)
<?php
namespace Namespace/Factory;
use Zend/ServiceManager/ServiceLocatorInterface;
use Zend/ServiceManager/FactoryInterface;
use Namespace/Model/MyModel;
class MyServiceFactory implements FactoryInterface
{
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
* @return mixed
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$myModel= new MyModel();
$myModel->setEntityManager($serviceLocator->get(''Doctrine/ORM/EntityManager''));
return $myModel;
}
}
Ahora esto es mucho para masticar: lo entiendo totalmente. Lo que está sucediendo aquí es en realidad muy simple. En lugar de crear su modelo y de alguna manera llegar al EntityManager, llame al ServiceManager de ZF2 para crear el Modelo para usted e inyecte el EntityManager en él.
Si esto todavía te resulta confuso, con mucho gusto trataré de explicarme mejor. Para una mayor aclaración, me gustaría saber sobre su caso de uso. Es decir: ¿para qué necesita el EntityManager o dónde exactamente lo necesita?
Este ejemplo de código está fuera del alcance de la pregunta
Solo para darle un ejemplo en vivo de algo que hago a través de ServiceFactories con formularios:
public function createService(ServiceLocatorInterface $serviceLocator)
{
$form = new ReferenzwertForm();
$form->setHydrator(new DoctrineEntity($serviceLocator->get(''Doctrine/ORM/EntityManager'')))
->setObject(new Referenzwert())
->setInputFilter(new ReferenzwertFilter())
->setAttribute(''method'', ''post'');
return $form;
}