我正在重构我的一个控制器中的代码以将其放入服务中。
在控制器中,实体管理器以名为legacy的数据库连接为目标。
问题是,我没有在我的服务中注入实体管理器,而只是注入了 OrderRepository。
如何在没有实体管理器的情况下,将良好的数据库连接与服务中的存储库作为目标?
订单控制器
// In my Controller
$em = $this->getDoctrine()->getManager('legacy');
$em->persist($order);
$em->flush();
订单服务
// In my Service
public function __construct(OrderRepository $orderRepository)
{
$this->orderRepository = $orderRepository;
}
public function updateOrderStatus(Order $order)
{
// some code ...
$this->orderRepository->save($order);
}
根据一些评论,基本问题似乎是有多个实体经理。 如今,有大量的自动化功能适用于一个实体经理,但不适用于多个经理。
您基本上需要手动定义服务。
# services.yaml
# assume we have
# doctrine.orm.default_entity_manager and
# doctrine.orm.legacy_entity_manager
# already defined through configuration
# define legacy repository
order_repository.legacy:
class: WhateverRepositoryOrderRepository
factory: ['doctrine.orm.legacy_entity_manager', 'getRepository']
arguments:
- 'WhateverEntityOrder'
# define default repository
order_repository.default:
class: WhateverRepositoryOrderRepository
factory: ['doctrine.orm.default_entity_manager', 'getRepository']
arguments:
- 'WhateverEntityOrder'
# then your service
WhateverServiceMyService:
'@order_repository.legacy'
你应该很高兴。 请注意,您的存储库需要扩展 EntityRepository,而不是原则包的 ServiceEntityRepository。
如果你觉得这工作量太大,那么只需注入原则包的实体管理器注册表,然后做 ControllerTrait::getDoctrine($name( 做的事情。
您必须忘记,您始终可以在存储库中获取实体管理器,就像这样:
$em = $this->getEntityManager();
然后你可以正常使用它调用持久,刷新等。
请注意,存储库类本身与数据库访问层的功能(如插入或更新(无关,因此它应该调用实体管理器来执行它们。