2012-02-20 9 views
0

私はdoctrine 2のドキュメントを読んで、トランザクションの境界について質問します。次の2つのコードスニペットの間に違いはありますか?あるいは、まったく同じことを暗黙的かつ明示的に行う2つの方法です。優先メソッド/ベストプラクティス(暗黙的または明示的)は何ですか?Doctrine 2トランザクションの境界設定:暗黙的対明示的

暗黙:

// $em instanceof EntityManager 
$user = new User; 
$user->setName('George'); 
$em->persist($user); 
$em->flush(); 

明示:

// $em instanceof EntityManager 
$em->transactional(function($em) { 
    $user = new User; 
    $user->setName('George'); 
    $em->persist($user); 
}); 

答えて

1

docsは言う:あなたは単位で カスタムDBAL操作を含めたいとき

明示的なトランザクション境界が必要です仕事をしたいときや使いたいとき mアクティブな トランザクションを必要とするEntityManager APIのエスポッドそのようなメソッドは、TransactionRequiredExceptionを に送り、その必要条件を通知します。

他のケースでは違いはなく、2つのうちのいずれかを使用できます(ノイズを減らすために暗黙的に指定することをお勧めします)。

+0

私はそれを壊すしようとすると、カスタム引数を関数($ em)に渡す方法はありますか? – blackuprise

+1

@blackuprise 'function($ em)use($ yourargument){$ yourargument ...}' – meze

関連する問題