0

アクションが呼び出されたCDbConnectionときにアクションを追加する方法はありますか?rollback

私はこのコードを持っていて、それは動作します:

$transaction = $model->dbConnection->beginTransaction();

try {
    //...
    //doing some manipulations
    //...

    if($model->save()) {
        $transaction->commit();
        $this->redirect(array('view','id'=>$model->id));
    }

} catch(Exception $e) {
    $transaction->rollback();
    throw $e;
}

トランザクション ロールバック関数にイベントを追加するなど$transaction->rollback();、ステートメントにこのコードを挿入せずに が呼び出されたときに行われた操作を元に戻す方法はありますか。catch

Behaviors と Eventsで回避策があるかもしれませんが、それがどのように機能するかはわかりません。

ありがとう!

編集- 私がやりたいことはこれです:

モデルの保存に失敗すると、データベースにロールバックが発生しますが、ファイルにもいくつかの操作を行っています (モデルを検証して保存する前に行う必要があります)。検証のために、これらの変更をファイルに戻す必要があります。

4

1 に答える 1

1

現在、CDbTransaction にはイベントが定義されていません。

私がすることは、再利用できる方法でこのロジックを処理するクラスを作成することです:

//protected/components/AtomicTransformation.php
<?php
class AtomicTransformation {
  private $_model;
  private $_transaction;
  public function __contruct(CModel $model)
  {
    $this->_model = $model;
    $this->_transaction = $model->dbConnection->beginTransaction();
  }
  public function commit()
  {
    $this->_transaction->commit();
  }
  public function rollback( /* pass any params you need for your revert logic */)
  {
    // Do your revert logic here
    $this->_transaction->rollback();
  }
}

$transformation = new AtomicTransformation($model);

try {
    //...
    //doing some manipulations
    //...

    if($model->save()) {
        $transformation->commit();
        $this->redirect(array('view','id'=>$model->id));
    }

} catch(Exception $e) {
    $transformation->rollback( /*your params */ );
    throw $e;
}
于 2013-01-16T18:46:41.317 に答える