- ベストアンサー
アスペクト指向によるトランザクションの記述サンプル
- PHP5.2.4を使用しています。Sabelフレームワーク内でのトランザクションの記述のサンプルを教えてください。
- アスペクト指向のトランザクションのロジックがSabelフレームワークのLogics_Aspects_Transactionクラスにあります。トランザクションを利用する際の記述のサンプルが知りたいです。
- SabelフレームワークのLogics_Aspects_Transactionクラスには、トランザクションの開始、コミット、ロールバックなどが記述されています。具体的なデータベースのデータ保存時の例も知りたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
過去のドキュメントを参考URLに記載しました。 class TransactionConfig extends Sabel_Container_Injection { public function configure() { $this->aspect("User")->advice("TransactionAdvice"); } } class TransactionAdvice { /** * @around movePoint */ public function processTransaction($invocation) { Sabel_DB_Transaction::activate(); # トランザクション有効化 try { $result = $invocation->proceed(); Sabel_DB_Transaction::commit(); # 正常終了 return $result; } catch (Exception $e) { Sabel_DB_Transaction::rollback(); # 例外が発生したらロールバック throw $e; } } } class User extends Sabel_DB_Model { public function movePoint() { $fromUser = MODEL("User", 1); if ($fromUser->point < $point) { throw new ... } else { $toUser = MODEL("User", 2); if ($toUser->isValid()) { ... } else { throw new ... } } } } として各クラスを、クラスパス上に配置します。 下記利用時のサンプルです。 $user = load("User", new TransactionConfig()); $user->movePoint(); とすれば、TransactionAdviceによるアスペクト処理が実行されます。 これは、@around movePoint としてアドバイスクラスにmovePointメソッドが指定されているので、movePoint()実行時の周辺(around)、つまりメソッドの実行前と実行後にアスペクトが介入します。
お礼
ご返答ありがとうございます。 そのようなページがあったんですか。 まだ使い方を完璧に把握したわけではありませんが、 とりあえず試してみたらできました。ありがとうございます。