2017-02-08 23 views
0

entityManagerがflushを実行し、このフラッシュが例外をスローしたとき。教義のエンティティ・マネージャは、この例外を受け取り、作業単位をクリアし、mark the connectionを閉じてロールバック(https://github.com/doctrine/doctrine2/blob/v2.5.6/lib/Doctrine/ORM/UnitOfWork.php#L412-L417)します。フラッシュの失敗後にDoctrine接続を復元する

私は接続を復元する必要がありますが、私はどのように処理するか困惑しているのEntityManagerで$this->closed = falseを行うと方法がないよう、この私はこれをマークする別のエンティティをflushできflushを失敗した後、それはデータベースの特定ににマークします失敗したタスク!また、以前のものが失敗したときに複数のタスクを実行することはできません。もう1つは、entityManagerを使用するときには実行できません。

TL; DRしたがって、フラッシュが失敗した後で接続を復元するにはどうすればよいですか?私はそれが閉鎖とマークされているだけで接続されているが、私はReflectionやカスタムエンティティマネージャのような何かを使用して接続を復元したくない。

答えて

3

編集

は、そのテーブルが日時と日付フィールドを持ち、nullではない

Exempleを言うことができます。この link

resetManager
$this->getDoctrine()->resetManager()このような、より詳細な機能を使用することができます

$Exemple = new Exemple(); $Exemple->setDate(null); $em = $this->getDoctrine()->getManager(); try { $em->persist($Exemple); $em->flush(); } catch (\Exception $ex) { $em = $this->getDoctrine()->resetManager(); } $Exemple->setDate(new \DateTime()); $em->persist($Exemple); $em->flush(); 

whith $this->getDoctrine()->resetManager();データがデータベースにフラッシュされました
$this->getDoctrine()->resetManager();を取得しましたEntityManagerが閉じています

+0

これは確かに可能です。少し助けてくれません。例外がスローされると、エンティティマネージャを使い続ける方法はありません。それに応じてダウン投票。 – Cerad

+0

こんにちは@Cerad私は私のコードとその仕事でresetManagerを使用して私は小さなexempleを置くために私の答えを編集するので、例外スロー後にgetManagerを使用することができないことを証明するドキュメンテーションを提供することができます –

+0

それはパースするのは少し難しいです元の質問ですが、私は彼が新しいエンティティマネージャを望んでいないと確信しています。彼が応答するかどうかを見てみましょう。 – Cerad

1

これを試してください。例外をスローすると、メソッドをキャッチしてください。その後、接続がまだ開いているかどうかを確認し、そうでなければ再定義します。

$result = $this->functionABC();// catch if it throws an exception 

$oEntityManager = $this->getContainer()->get('doctrine')->getManager(); 
$bEntityManagerIsOpen = $oEntityManager->isOpen(); 
if (!$bEntityManagerIsOpen) { 
    $this->getContainer()->get('doctrine')->resetManager(); 
    $oEntityManager = $this->getContainer()->get('doctrine')->getManager(); 
} 

私はこの方法をSymfony2.8を使用してコマンドに使用しています。これは私のために適切に動作します。

+0

ありがとうございます。これを試してみますが、マネージャーが別のサービスで使用されていて、サービスが新しいマネージャーを取得するとは思わない場合、これが機能するかどうかはわかりません。 –