Ground Sunlight

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

ユーザ用ツール

サイト用ツール


apricot:usage:ja:controller

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:usage:ja:controller [2020/08/26 21:02]
y2sunlight [トランザクション]
apricot:usage:ja:controller [2020/09/03 13:46] (現在)
y2sunlight [Apricot コントローラ]
行 1: 行 1:
-> 編集中 
- 
----- 
- 
 ====== Apricot コントローラ ====== ====== Apricot コントローラ ======
  --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-29//  --- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-29//
行 21: 行 17:
   * [[apricot:usage:ja:validation|Apricot バリデーション]]   * [[apricot:usage:ja:validation|Apricot バリデーション]]
   * [[apricot:usage:ja:provider|Apricot サービスプロバイダー]]   * [[apricot:usage:ja:provider|Apricot サービスプロバイダー]]
 +  * [[apricot:usage:ja:authentication|Apricot ユーザ認証]]
   * [[apricot:usage:ja:utility|Apricot ユーティリティ]]   * [[apricot:usage:ja:utility|Apricot ユーティリティ]]
  
行 360: 行 357:
 ===== トランザクション ===== ===== トランザクション =====
  
-Apricotでは、コントローラのアクションをラップする形でトランザクションをアクションに適用できます。Apricotは、トランザクションの適用されたアクションを呼び出す前にトランザクションを開始し、アクションが正常に終了するとそのトランザクションをコミットします。アクションが ''ApplicationException'' 例外をスローした場合、Apricotは、それをキャッチしてエラーログを出力して、アクションの代わりに前画面に戻るリダイレクトレスポンスをクライアントに返します。これらの処理は全てApricotのフレームワーク内で行われるのでアクションのコーディングを最小限にすることができます。+Apricotでは、コントローラのアクションをラップする形で、アクションにトランザクションを適用することができます。Apricotは、トランザクションの適用されたアクションを呼び出す前にトランザクションを開始し、アクションが正常に終了するとそのトランザクションをコミットします。アクションが ''ApplicationException'' 例外をスローした場合、Apricotは、それをキャッチしてエラーログを出力して、アクションの代わりに前画面に戻るリダイレクトレスポンスをクライアントに返します。これらの処理は全てApricotのフレームワーク内で行われるのでアクションのコーディングを最小限にすることができます。
  
 \\ \\
行 366: 行 363:
 ==== トランザクションの適用 ==== ==== トランザクションの適用 ====
  
-アクションにトランザクションを適用するには、以下のように、コントローラの ''transactional()'' メソッドを使用します。+アクションにトランザクションを適用するには、以下のように、コンストラクターの中で、コントローラの ''transactional()'' メソッドを使用します。
  
 <code php> <code php>
行 385: 行 382:
 \\ \\
  
-==== トランザクション処理 ====+==== トランザクション処理 ====
  
 以下は、ユーザコントローラの update アクションの例です。 以下は、ユーザコントローラの update アクションの例です。
行 391: 行 388:
 <code php> <code php>
 /** /**
- Inserts a user record.+ Updates a user record.
  *  *
 + * @param int $id
  * @return \Apricot\Foundation\Response  * @return \Apricot\Foundation\Response
  */  */
-public function insert()+public function update(int $id)
 { {
     $inputs = Input::all();     $inputs = Input::all();
行 401: 行 399:
     try     try
     {     {
-        $user = $this->user->insert($inputs);+        $this->user->update($id, $inputs);
     }     }
     catch(ApplicationException $e)     catch(ApplicationException $e)
行 409: 行 407:
     catch(\Exception $e)     catch(\Exception $e)
     {     {
-        throw new ApplicationException(__('messages.error.db.insert'));+        throw new ApplicationException(__('messages.error.db.update'));
     }     }
  
     // Redirects to the user edit page.     // Redirects to the user edit page.
-    return redirect(route("user/{$user->id}/edit"));+    return redirect(route("user/{$id}/edit"));
 } }
 </code> </code>
  
 +この例では、ユーザモデル( <nowiki>$this->user</nowiki> ) の update() メソッドで、ユーザデータを変更しています。updateアクションにはコントローラの transactional() メソッドによってトランザクションが適用されているので、データベースのトランザクションはフレームワークが自動で開始してくれます。
  
 +アクションがしなければならないことは、モデルの例外を捕捉して、ApplicationException をスローすることだけです。フレームワークは ApplicationException またはそれを親に持つ例外のみを捕捉します。それ以外の例外は、集約エラーハンドラーによって補足されシステムエラーになります。即ち、フレームワークは、ApplicationException のみ前画面に戻すリダイレクトレスポンスを生成します。
  
-この例では、ユーザモデル( <nowiki>$this->user</nowiki>の insert() メソッドで、新しいユーザデータベーに追加しています。データベースのトランザクションはフレームワクが自動で開始てくれます+モデルは次場合に ApplicationException をスーします
  
-ションがしなければならないことは、モデルの例外を捕捉して、ApplicationException をスローすることだけです。フレームワークは ApplicationException またはそれを親に持つ例外のみを捕捉します。それ以外の例外は、集約エラハンドラーによって補足されシテムエラーります。即ち、フレームワークは、ApplicationException のみ前画面に戻すリダイレクトレスポンスを生成しす。+  * 楽観的ロッ例外発生した場合( ''OptimissticLockException''
 +  * 対象レコードが存在しない場合(ド更新時および削除時) 
 + 
 +ションで、これ以外の例外が発生した場合は、ースエラーなどの ''Error'' を除き''ApplicationException'' を生成してそれをスローすべきです。 
 + 
 +=== クエリーの例外処理 ===
  
 +通常、トランザクションは更新系の処理で設定するするので、クエリーで発生した全ての例外は集約エラーハンドラで処理されエラー画面が表示されます。この状況を避けたい場合は、次の何れかの選択になるでしょう。
  
-  * transactional()を使って3つのアクション( ''insert()'', ''update()'', ''delete()'' )のトランザクション処理が有効になるように設定していま+  * クエリーのアクションにもトランザクション設定する 
 +  * アクション内のcatchブロックでエラーメッセージ付きの入力ページをレンダリングする
  
 \\ \\
  
apricot/usage/ja/controller.1598443362.txt.gz · 最終更新: 2020/08/26 21:02 by y2sunlight