ZF2 как получить диспетчер сущностей из-за пределов контроллера

мы можем получить доступ к диспетчеру сущностей в контроллере, используя $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');

но как мы можем получить доступ к единственному экземпляру диспетчера сущностей в остальной части проекта в Zendframework 2.


person Developer    schedule 08.08.2012    source источник
comment
Просто вопрос: поскольку вы говорите об ORM Doctrine, у вас возникают проблемы с тем, чтобы свести entityManager до уровня вашего набора полей? :)   -  person Sam    schedule 10.08.2012


Ответы (1)


«Правильный» способ сделать это - использовать фабрику для внедрения менеджера сущностей в любые классы, которые в нем нуждаются. Классы, кроме фабрик, не должны знать о ServiceLocator. Итак, конфигурация вашего модуля будет выглядеть так:

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

Тогда ваш заводской класс будет выглядеть примерно так:

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

Следуйте той же схеме для любых других классов, которым необходимо использовать диспетчер сущностей.

Если у вас очень много классов, использующих диспетчер сущностей, вы можете подумать о добавлении собственного инициализатора в SerivceManager, который будет внедрять диспетчер сущностей без необходимости в фабрике.

person superdweebie    schedule 08.08.2012
comment
Мне нравится ваше последнее предложение. Он может создать «EntityManagerAwareInterface» и заставить ServiceLocator автоматически внедрять его в любые классы, которые его реализуют. Я думаю, что они упоминают об этом в README страницы доктрины-формы-модуля в самом низу. Скоро будет. - person Jerry Saravia; 10.08.2012
comment
Да, вы должны быть осторожны с инициализаторами — они запускаются каждый раз, когда объект извлекается из ServiceManager. Если вы складываете ServiceManager с малоиспользуемыми инициализаторами, вы просто замедляете работу, поэтому я предлагаю это только в том случае, если диспетчер сущностей необходим во многих классах. - person superdweebie; 10.08.2012
comment
хорошее замечание по поводу этого комментария к производительности. Спасибо, что помогли мне увидеть это. - person Jerry Saravia; 10.08.2012