我们可以控制器中访问实体管理器之外使用$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
ZF2如何从控制器
得到实体管理器,但我们如何可以访问实体管理单一实例在该项目的其余部分Zendframework 2
我们可以控制器中访问实体管理器之外使用$this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
ZF2如何从控制器
得到实体管理器,但我们如何可以访问实体管理单一实例在该项目的其余部分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中,它将注入实体管理器而不需要工厂。
我喜欢你最后的建议。他可以创建一个'EntityManagerAwareInterface'并让ServiceLocator自动将它注入到实现它的任何类中。我认为他们一直在底层的教条-ORM模块页面的自述文件中提到这一点。它即将推出。 – 2012-08-09 20:49:15
是的,你要小心使用Initalizers - 每次从ServiceManager获取对象时都会运行它们。如果您将ServiceManager与未使用太多的Initalizers进行堆叠,那么您只是放慢速度,这就是为什么我只是建议如果实体管理器需要很多类。 – superdweebie 2012-08-09 22:32:53
该表现评论的好处。感谢您帮助我看到这一点。 – 2012-08-10 02:21:13
只是一个问题,因为你在谈论Doctrine ORM,你有麻烦让entityManager降到你的fieldset级别吗? :) – Sam 2012-08-10 05:11:00