Symfony 2.6でDoctrineを使用して、永続化されたエンティティのトランザクションロールバックを「検出」する方法はありますか?
私の元の問題:ファイルシステム上のファイルを表す新しいエンティティを作成します。$em->persist()
これらのエンティティからファイルを移動/temp
DoctrineのPrePersistイベントを介したディレクトリの最終destiantionに。作業中のトランザクションがコードの後半でロールバックされた場合、データベースに行は作成されませんが、ファイルは残り、$em->rollback()
追加のコードを使用して、これを行うたびに手動で削除する必要があります。したがって、エンティティが変更リストから「削除」または「ロールバック」されたことを検出するために使用できるイベントがある可能性があるので、エンティティの関連ファイルを削除できます。
また:PostPersistまたはPostFlushイベントは私の問題を解決するように見えますが、いくつかの$em->flush()
命令があり、コードの下にあるものが例外をスローし、$em->rollback()
トランザクション全体で実行すると、まだファイルが残っています
デフォルトでは、Doctrineにはロールバックイベントはありません。しかし、できることは、Connectionクラスを拡張して、独自のイベントをスローすることです。
<?php
namespace Acme\MyBundle\Doctrine\DBAL;
use Doctrine\DBAL\Connection;
use Ozean12\ApiSDKBundle\Doctrine\Event\PostCommitEventArgs;
use Ozean12\ApiSDKBundle\Doctrine\Event\PostRollbackEventArgs;
/**
* Class ConnectionWrapper
*/
class ConnectionWrapper extends Connection
{
/**
* {@inheritdoc}
*/
public function commit()
{
parent::commit();
if (!$this->isTransactionActive()) { // to be sure that we are committing a top-level transaction
$this->getEventManager()->dispatchEvent(PostCommitEventArgs::NAME, new PostCommitEventArgs());
}
}
/**
* {@inheritdoc}
*/
public function rollBack()
{
parent::rollBack();
if (!$this->isTransactionActive()) { // to be sure that we are rolling-back a top-level transaction
$this->getEventManager()->dispatchEvent(PostRollbackEventArgs::NAME, new PostRollbackEventArgs());
}
}
}
次に、このクラスを接続ラッパーとして宣言します。
doctrine:
dbal:
wrapper_class: Acme\MyBundle\Doctrine\DBAL\ConnectionWrapper
そして、イベントクラスとサブスクライバーを作成します。onFlushイベントをリッスンすることで、同じサブスクライバークラス内の永続化されたエンティティを追跡できるため、コミットまたはロールバックが発生したときにエンティティに対してアクションを実行できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加