在 symfony2 中的不同服务之间共享的学说 EntityManager 实例中应该如何处理刷新?

问题描述 投票:0回答:1

我在 symfony 2 中定义了几个服务,它们可以保存对数据库的更改。 这些服务将学说实例作为其依赖项之一:

a.given.service:
    class: Acme\TestBundle\Service\AGivenService
    arguments: [@doctrine]

如果我有两个不同的服务,并且它们都通过 EntityManager 持久化对象,这是从学说实例中获取的:

$em = $doctrine->getEntityManager();

所有服务是否始终共享同一个 EntityManager? 如果是这样,如果我想处理单个事务中的所有更改,我应该如何处理刷新? 我已经检查过:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/transactions-and-concurrency.html,它解释了如何处理不同的事务请求,但我想要实现的是将不同服务中的不同更改作为单个事务处理。

是否有更好的方法来处理不同服务中的多个变更?

目前我最好的选择是让前端服务负责调用其他服务并随后进行刷新。后端服务将持久化对象,但不会进行任何刷新。

doctrine symfony
1个回答
4
投票

您引用的文档正是您想要的:

$em->getConnection()->beginTransaction();
try{
  $service1 = $this->get('myservice1');
  $service1->doSomething();

  $service2 = $this->get('myservice2');
  $service2->doSomething();

  $em->getConnection()->commit();
catch(\Exception $e){
  $em->getConnection()->rollback();
}

如果您的

$em
与容器中的相同,即您仅使用一个实体管理器,那么您现在可以刷新服务内部并在发生错误时回滚。

© www.soinside.com 2019 - 2024. All rights reserved.