Как очистка должна обрабатываться в экземпляре доктрины EntityManager, совместно используемом различными службами в symfony2? - PullRequest
3 голосов
/ 20 марта 2012

Я определил несколько служб в 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 и объясняет, как обрабатывать различные транзакции в запрос, но я хочу добиться, чтобы различные изменения в разных службах обрабатывались как одна транзакция.

Есть ли лучший подход для обработки нескольких изменений в разных сервисах?

На данный момент моя лучшая ставка в том, чтобы иметь внешний сервис, отвечающий за вызов других сервисов и последующую очистку. Внутренние службы сохраняют объекты, но не выполняют сброс.

1 Ответ

3 голосов
/ 20 марта 2012

Указанные вами документы - это именно то, что вам нужно:

$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 такой же, как в вашем контейнере, т.е. вы используете только одного менеджера сущностей, вы теперь можетеочистите ваши службы и откатитесь, если произойдет ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...