2012-03-19 7 views
3

私はsymfony 2でいくつかのサービスを定義しており、これはデータベースの変更を持続します。 これらのサービスは、その依存関係の1つとして、教義のインスタンスを持っている:私は2つの異なるサービスを持っており、それらの両方が教義のインスタンスから、次のように求められるのEntityManagerを介して、オブジェクトを永続化した場合symfony2の異なるサービス間で共有されているDoctrine EntityManagerインスタンスでフラッシングをどのように処理する必要がありますか?

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

$em = $doctrine->getEntityManager(); 

すべてのサービスは常に同じEntityManagerを共有しますか? もしそうなら、一回のトランザクションですべての変更を処理したいと思ったら、どのようにフラッシュするのですか? 私はこれをチェックしました:http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/transactions-and-concurrency.htmlとリクエストで異なるトランザクションを処理する方法を説明しますが、達成したいのは、単一のトランザクションとして扱われるさまざまなサービスに異なる変更を加えることです。

異なるサービスで複数の変更を処理する方がよいでしょうか?

今のところ私の最善の策は、他のサービスの呼び出しとその後のフラッシングを担当するフロントエンドサービスです。バックエンドサービスはオブジェクトを永続させますが、フラッシングは行いません。

答えて

3

あなたが引用されたドキュメント正確に何をしたいです:、あなただけの1つのエンティティマネージャを使用しているすなわち

$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はあなたのコンテナ内のものと同じである場合は、ここでフラッシュすることができますエラーが発生した場合はロールバックしてください。

+0

あなたは正しいです。私は文書の中の例から、あなたがトランサセットの中で何度も洗い流すことができるということを理解していませんでした。私はまた、 "自動コミットを中断"コメントを見落としました。 – Jens

関連する問題