编辑1:似乎我没有很好地解释自己。Foo 类不是实体。只是一个通用模型,我想访问实体管理器。
编辑2:我认为我的问题没有答案。基本上,我想要一个可以访问 EntityManager 的类,而无需服务管理器调用该类,这仅仅是因为它可能被一个也未被服务管理器调用的类调用。换句话说,我试图实现 Zend_Registry 在 ZF1 中实现的目标。我必须找到另一种方法来做我想做的事情。
我正在尝试在模型中访问 Doctrine 的实体管理器,其方式与在控制器中所做的类似:
$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
ZF2 手册(http://framework.zend.com/manual/2.0/en/modules/zend.service-manager.quick-start.html)说:
默认情况下,Zend Framework MVC 注册一个初始化器,它将注入 ServiceManager 实例,它是 Zend\ServiceManager\ServiceLocatorInterface 的实现,到任何实现 Zend\ServiceManager\ServiceLocatorAwareInterface 的类中。
所以我创建了以下类:
<?php
namespace MyModule\Model;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Foo implements ServiceLocatorAwareInterface
{
protected $services;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
{
$this->services = $serviceLocator;
}
public function getServiceLocator()
{
return $this->services;
}
public function test()
{
$em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
}
}
然后,从另一个类中,我这样称呼这个类:
$foo = new \MyModule\Model\Foo();
$foo->test()
引发以下错误:
PHP 致命错误:在非对象上调用成员函数 get()
所以,我想我在某个地方遗漏了一些东西,但是什么?在哪里?如何?也许有一个更容易访问实体管理器?
谢谢!