在Zend Framework 2应用程序中,我有一些具有依赖关系的Doctrine2实体,它们由ServiceManager注入其中,i。即订单在创建时需要新的发票。
'service_manager' => [
'invokables' => [
'Sales\Entity\Invoice' => 'Sales\Entity\Invoice'
],
'factories' => [
'Sales\Entity\Order' => function($sm) {
$order = new \Sales\Entity\Order();
$order->setInvoice($sm->get('Sales\Entity\Invoice'));
return $order;
}
],
'shared' => [
'Sales\Entity\Invoice' => false,
'Sales\Entity\Order' => false
]
]
使用此配置,创建一个在应用程序中的任何位置分配了新Invoice的新订单都没有问题,因为例如在控制器内我可以调用
$order = $this->getServiceLocator()->get('serviceManager')->get('Sales\Entity\Order');
但是,当通过EntityRepository检索订单时,不会注入依赖项,因为据我所知,Doctrine通过调用其构造函数实例化实体,然后在需要另一个实例时克隆该实例。因此,Doctrine会绕过ServiceManager,从而绕过依赖注入。
予。即
$order = $entityManager->getRepository('Sales\Entity\Order')->find(42);
会在没有新发票的情况下给我订单。
我知道直接将依赖项注入实体可能不是最好的解决方案,但此时我们正在使用我们的应用程序中的胖模型而没有模型服务层,为了快速修复,我必须让它工作。计划在未来进行重构,但目前尚未进行讨论。
是否有可能改变Doctrine实例化新实体的方式?我深入了解EntityManager和EntityRepository,但尚未找到解决方案。