このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
apricot:app:transaction [2020/05/15 10:11] y2sunlight 作成 |
apricot:app:transaction [2020/05/15 17:02] y2sunlight [テスト実行] |
||
---|---|---|---|
行 15: | 行 15: | ||
* [[apricot: | * [[apricot: | ||
* [[apricot: | * [[apricot: | ||
- | * [[apricot: | + | * [[apricot: |
* Apricot トランザクション | * Apricot トランザクション | ||
* [[apricot: | * [[apricot: | ||
行 32: | 行 32: | ||
---- | ---- | ||
===== コントローラベース ===== | ===== コントローラベース ===== | ||
- | >TODO | + | |
+ | コントローラのベースクラス(Controller)に以下のprotectedメソッドを追加します。 | ||
+ | |||
+ | ^メソッド^機能^ | ||
+ | |transactional\\ (array< | ||
+ | |callAction\\ (string $actionName, | ||
+ | |||
+ | callAction() はコアの[[apricot: | ||
+ | |||
+ | 以下にControllerクラスのソースコードを示します。 | ||
{{fa> | {{fa> | ||
行 105: | 行 114: | ||
</ | </ | ||
- | * TODO | + | * **transactional($actionName)** |
- | * 記号なしリスト | + | * アクションをトランザクションアクション配列( '' |
+ | * $actionNameは配列、文字列、文字列だけの可変長引数のいずれでも可能です | ||
+ | * **callAction($actionName, | ||
+ | * '' | ||
+ | * 普通にアクションを呼び出します | ||
+ | * '' | ||
+ | * ORMのbeginTransaction()でトランザクションを開始します | ||
+ | * アクションを呼び出します | ||
+ | * アクションが正常終了の場合 | ||
+ | * ORMのcommit()でトランザクションをコミットします | ||
+ | * アクションのResponseを返します | ||
+ | * アクション内で例外が発生した場合 | ||
+ | * ORMのrollBack()でトランザクションをロールバックします | ||
+ | * withInputs()で入力変数をフラッシュ変数に保存します | ||
+ | * withErrors()で例外メッセージのエラーバッグをフラッシュ変数に保存します | ||
+ | * redirect()で前画面にリダイレクトするResponseオブジェクトをします | ||
\\ | \\ | ||
===== ユーザコントローラ ===== | ===== ユーザコントローラ ===== | ||
- | アクションにトランザクションを設定したい場合は、コントローラのコンストラクタ内で以下のように行います。 | + | アクションのトランザクション処理を有効にしたい場合は、コントローラのコンストラクタの中でControllerクラスのtransactional()メソッドを使って、以下のようにします。 |
- | >TODO: | + | * **transactional( ' |
{{fa> | {{fa> | ||
行 149: | 行 173: | ||
</ | </ | ||
- | * TODO | + | * transactional()を使って3つのアクション( '' |
- | * 記号なしリスト | + | |
+ | \\ | ||
+ | |||
+ | ===== テスト実行 ===== | ||
+ | |||
+ | 楽観的ロック例外を使って、トランザクション機能をテストしてみましょう。 | ||
+ | |||
+ | 2つのApricot画面を開きます: | ||
+ | - 画面A | ||
+ | - 画面B | ||
+ | |||
+ | 画面A, | ||
+ | |||
+ | === 画面A === | ||
+ | [{{apricot: | ||
+ | ■ 備考を変更して[保存]ボタンを押します。 | ||
+ | |||
+ | [{{apricot: | ||
+ | ■ 正常に保存できます。 | ||
+ | |||
+ | \\ | ||
+ | |||
+ | === 画面B === | ||
+ | [{{apricot: | ||
+ | ■ 備考を変更して[保存]ボタンを押します。 | ||
+ | |||
+ | [{{apricot: | ||
+ | ■ 画面表示時点のデータが変更されているので楽観的ロック例外が発生してエラーメッセージが表示されます。 | ||
\\ | \\ | ||