Zend framework2 ZF2如何从控制器外部获取实体管理器

Zend framework2 ZF2如何从控制器外部获取实体管理器,zend-framework2,Zend Framework2,我们可以使用$this->getServiceLocator()->get('doctrine.entitymanager.orm_default')访问控制器中的实体管理器 但我们如何访问ZendFramework2项目其余部分中的EntityManagerSingleton实例呢 正确的方法是使用工厂将实体管理器注入任何需要它的类中。类,而不是工厂,不应该真正了解ServiceLocator。因此,您的模块配置如下所示: 'controllers' => array( 'f

我们可以使用
$this->getServiceLocator()->get('doctrine.entitymanager.orm_default')访问控制器中的实体管理器


但我们如何访问ZendFramework2项目其余部分中的EntityManagerSingleton实例呢

正确的方法是使用工厂将实体管理器注入任何需要它的类中。类,而不是工厂,不应该真正了解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;
    }
}
那么您的factory类将如下所示:

 '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;
    }
}
对于需要使用实体管理器的任何其他类,请遵循相同的模式


如果您有大量的类消耗了实体管理器,您可能需要考虑将自己的Initalizer添加到SerivceManager,这将在不需要工厂的情况下注入实体管理器。

我喜欢您的最后建议。他可以创建一个“EntityManagerWareInterface”,并让ServiceLocator自动将其注入实现它的任何类。我想他们在“条令orm模块自述”页面的底部都提到了这一点。很快就要来了。是的,你要小心初始化器——每次从ServiceManager获取对象时都会运行初始化器。如果将ServiceManager与使用不多的初始化器堆叠在一起,只会减慢速度,这就是为什么我只在许多类中需要实体管理器时才建议使用它的原因。这是一个很好的性能注释。谢谢你帮我了解这一点。我只是想问一个问题,既然你在谈论ORM原则,你在将entityManager降低到你的字段集级别时有困难吗?:)