我们可以使用控制器访问实体管理器$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
但是我们如何在 Zendframework 2 的项目的其余部分访问实体管理器单例实例。
我们可以使用控制器访问实体管理器$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
但是我们如何在 Zendframework 2 的项目的其余部分访问实体管理器单例实例。
做到这一点的“正确”方法是使用工厂将实体管理器注入到任何需要它的类中。除了工厂,类不应该真正了解 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;
}
}
对于需要使用实体管理器的任何其他类,请遵循相同的模式。
如果您有大量使用实体管理器的类,您可能需要考虑将您自己的 Initalizer 添加到 SerivceManager 中,这样无需工厂即可注入实体管理器。