Doctrineのロールバックイベントはありますか?つまり、ロールバックがあるチェンジリスト上のエンティティに処理を実行します

ファン

Symfony 2.6でDoctrineを使用して、永続化されたエンティティのトランザクションロールバックを「検出」する方法はありますか?

私の元の問題:ファイルシステム上のファイルを表す新しいエンティティを作成します。$em->persist()これらのエンティティからファイルを移動/tempDoctrineの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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ