Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


apricot:app:transaction

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:app:transaction [2020/05/15 10:30]
y2sunlight [テスト実行]
apricot:app:transaction [2020/05/21 10:41] (現在)
y2sunlight [Apricot トランザクション]
行 17: 行 17:
     * [[apricot:app:validation|Apricot バリデーション]]     * [[apricot:app:validation|Apricot バリデーション]]
     * Apricot トランザクション     * Apricot トランザクション
-  * [[apricot:ext:top|Apricot 拡張]]+  * [[apricot:ext:middleware|Apricot 拡張]]
  
 ユーザ登録画面にトランザクションの機能を追加します。トランザクションを作るか否かはアクション毎に設定できるようにします。また、トランザクション機能を追加することによりアクションでスローされる [[apricot:app:top#例外クラス|ApplicationException]] をキャッチして(エラー画面に遷移することなく)入力画面でエラーメッセージを表示できるようになります。アクションでスローされるApplicationException には以下のものがあります。 ユーザ登録画面にトランザクションの機能を追加します。トランザクションを作るか否かはアクション毎に設定できるようにします。また、トランザクション機能を追加することによりアクションでスローされる [[apricot:app:top#例外クラス|ApplicationException]] をキャッチして(エラー画面に遷移することなく)入力画面でエラーメッセージを表示できるようになります。アクションでスローされるApplicationException には以下のものがあります。
行 32: 行 32:
 ---- ----
 ===== コントローラベース ===== ===== コントローラベース =====
->TODO+ 
 +コントローラのベースクラス(Controller)に以下のprotectedメソッドを追加します。 
 + 
 +^メソッド^機能^ 
 +|transactional\\ (array<nowiki>|</nowiki>string $actionName):void|トランザクションを開始するアクションの指定| 
 +|callAction\\ (string $actionName, array $params):Response|アクションの起動| 
 + 
 +callAction() はコアの[[apricot:core:base-controller|BaseControllerクラス]]のオーバーライドです。この関数はApplicationクラスが実際にアクションを呼びだす時に使用されます。 
 + 
 +以下にControllerクラスのソースコードを示します。
  
 {{fa>folder-open-o}} ** /apricot/app/Foundation ** {{fa>folder-open-o}} ** /apricot/app/Foundation **
行 105: 行 114:
 </code> </code>
  
-  * TODO +  * **transactional($actionName)** 
-  記号なしリス+    アクションをランザクションアクション配列( ''$transactionalActions'' )に追加します 
 +    * $actionNameは配列、文字列、文字列だけの可変長引数のいずれでも可能です
  
 +  * **callAction($actionName, $params)**
 +    * ''$transactionalActions'' に追加されていないアクションの場合
 +       * 普通にアクションを呼び出します
 +    * ''$transactionalActions'' に追加されてるアクションの場合
 +       * ORMのbeginTransaction()でトランザクションを開始します
 +       * アクションを呼び出します
 +       * アクションが正常終了の場合
 +         * ORMのcommit()でトランザクションをコミットします
 +         * アクションのResponseを返します
 +       * アクション内で例外が発生した場合
 +         * ORMのrollBack()でトランザクションをロールバックします
 +         * withInputs()で入力変数をフラッシュ変数に保存します
 +         * withErrors()で例外メッセージのエラーバッグをフラッシュ変数に保存します
 +         * redirect()で前画面にリダイレクトするResponseオブジェクトをします
 \\ \\
  
 ===== ユーザコントローラ ===== ===== ユーザコントローラ =====
  
-アクショントランザクションを設定したい場合は、コントローラのコンストラクタで以下のように行います。+アクショントランザクション処理有効にしたい場合は、コントローラのコンストラクタの中Controllerクラスのtransactional()メソッドを使って、以下のようにます。
  
->TODO:+  * **transactional( 'action1', ... );**
  
 {{fa>folder-open-o}} ** /apricot/app/Controllers ** {{fa>folder-open-o}} ** /apricot/app/Controllers **
行 149: 行 173:
 </code> </code>
  
-  * TODO +  * transactional()を使って3つのアクション( ''insert()'', ''update()'', ''delete()'' )のトランザクション処理が有効にるように設定ています。
-  * 記号なしリスト+
  
 \\ \\
行 156: 行 179:
 ===== テスト実行 ===== ===== テスト実行 =====
  
-楽観的ロック例外を使って、トランザクション機能をテストしてみましょう。2つのApricot画面を開きます:+楽観的ロック例外を使って、トランザクション機能をテストしてみましょう。
  
 +2つのApricot画面を開きます:
   - 画面A   - 画面A
   - 画面B   - 画面B
  
-画面A,B共にrootユーザの編集画面を表示します。+前もって 画面A,B共にrootユーザの編集画面を表示しておきます。
  
 === 画面A === === 画面A ===
-[{{apricot:app:app10.png?nolink}}]+[{{apricot:app:app11.png?nolink}}]
 ■ 備考を変更して[保存]ボタンを押します。 ■ 備考を変更して[保存]ボタンを押します。
  
-[{{apricot:app:app10.png?nolink}}]+[{{apricot:app:app12.png?nolink}}] 
 +■ 正常に保存できます。
  
 \\ \\
  
 === 画面B === === 画面B ===
-[{{apricot:app:app10.png?nolink}}]+[{{apricot:app:app13.png?nolink}}]
 ■ 備考を変更して[保存]ボタンを押します。 ■ 備考を変更して[保存]ボタンを押します。
  
-[{{apricot:app:app10.png?nolink}}] +[{{apricot:app:app14.png?nolink}}] 
-■ TODO+■ 画面表示時点のデータが変更されているので楽観的ロック例外が発生します。
  
 \\ \\
  
apricot/app/transaction.1589506215.txt.gz · 最終更新: 2020/05/15 10:30 by y2sunlight