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