このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
apricot:app:transaction [2020/05/15 10:31] y2sunlight [テスト実行] |
apricot:app:transaction [2020/05/21 10:41] (現在) y2sunlight [Apricot トランザクション] |
||
|---|---|---|---|
| 行 17: | 行 17: | ||
| * [[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つのアクション( '' |
| - | * 記号なしリスト | + | |
| \\ | \\ | ||
| 行 162: | 行 185: | ||
| - 画面B | - 画面B | ||
| - | 画面A, | + | 前もって |
| === 画面A === | === 画面A === | ||
| - | [{{apricot: | + | [{{apricot: |
| ■ 備考を変更して[保存]ボタンを押します。 | ■ 備考を変更して[保存]ボタンを押します。 | ||
| - | [{{apricot: | + | [{{apricot: |
| + | ■ 正常に保存できます。 | ||
| \\ | \\ | ||
| === 画面B === | === 画面B === | ||
| - | [{{apricot: | + | [{{apricot: |
| ■ 備考を変更して[保存]ボタンを押します。 | ■ 備考を変更して[保存]ボタンを押します。 | ||
| - | [{{apricot: | + | [{{apricot: |
| - | ■ TODO | + | ■ 画面表示時点のデータが変更されているので楽観的ロック例外が発生します。 |
| \\ | \\ | ||