このページの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 コントローラ ====== | ||
| --- // | --- // | ||
| 行 21: | 行 17: | ||
| * [[apricot: | * [[apricot: | ||
| * [[apricot: | * [[apricot: | ||
| + | * [[apricot: | ||
| * [[apricot: | * [[apricot: | ||
| 行 360: | 行 357: | ||
| ===== トランザクション ===== | ===== トランザクション ===== | ||
| - | Apricotでは、コントローラのアクションをラップする形でトランザクションをアクションに適用できます。Apricotは、トランザクションの適用されたアクションを呼び出す前にトランザクションを開始し、アクションが正常に終了するとそのトランザクションをコミットします。アクションが '' | + | Apricotでは、コントローラのアクションをラップする形で、アクションにトランザクションを適用することができます。Apricotは、トランザクションの適用されたアクションを呼び出す前にトランザクションを開始し、アクションが正常に終了するとそのトランザクションをコミットします。アクションが '' |
| \\ | \\ | ||
| 行 366: | 行 363: | ||
| ==== トランザクションの適用 ==== | ==== トランザクションの適用 ==== | ||
| - | アクションにトランザクションを適用するには、以下のように、コントローラの '' | + | アクションにトランザクションを適用するには、以下のように、コンストラクターの中で、コントローラの '' |
| <code php> | <code php> | ||
| 行 385: | 行 382: | ||
| \\ | \\ | ||
| - | ==== トランザクション処理 ==== | + | ==== トランザクションの処理 ==== |
| 以下は、ユーザコントローラの update アクションの例です。 | 以下は、ユーザコントローラの update アクションの例です。 | ||
| 行 391: | 行 388: | ||
| <code php> | <code php> | ||
| /** | /** | ||
| - | | + | |
| * | * | ||
| + | * @param int $id | ||
| * @return \Apricot\Foundation\Response | * @return \Apricot\Foundation\Response | ||
| */ | */ | ||
| - | public function | + | public function |
| { | { | ||
| $inputs = Input:: | $inputs = Input:: | ||
| 行 401: | 行 399: | ||
| try | try | ||
| { | { | ||
| - | | + | $this-> |
| } | } | ||
| catch(ApplicationException $e) | catch(ApplicationException $e) | ||
| 行 409: | 行 407: | ||
| catch(\Exception $e) | catch(\Exception $e) | ||
| { | { | ||
| - | throw new ApplicationException(__(' | + | throw new ApplicationException(__(' |
| } | } | ||
| // Redirects to the user edit page. | // Redirects to the user edit page. | ||
| - | return redirect(route(" | + | return redirect(route(" |
| } | } | ||
| </ | </ | ||
| + | この例では、ユーザモデル( < | ||
| + | アクションがしなければならないことは、モデルの例外を捕捉して、ApplicationException をスローすることだけです。フレームワークは ApplicationException またはそれを親に持つ例外のみを捕捉します。それ以外の例外は、集約エラーハンドラーによって補足されシステムエラーになります。即ち、フレームワークは、ApplicationException のみ前画面に戻すリダイレクトレスポンスを生成します。 | ||
| - | この例では、ユーザモデル( < | + | モデルは次の場合に ApplicationException |
| - | アクションがしなければならないことは、モデルの例外を捕捉して、ApplicationException をスローすることだけです。フレームワークは | + | * 楽観的ロック例外が発生した場合( '' |
| + | * 対象レコードが存在しない場合(レコード更新時および削除時) | ||
| + | |||
| + | アクションでは、これ以外の例外が発生した場合は、パースエラーなどの '' | ||
| + | |||
| + | === クエリーの例外処理 === | ||
| + | 通常、トランザクションは更新系の処理で設定するするので、クエリーで発生した全ての例外は集約エラーハンドラで処理されエラー画面が表示されます。この状況を避けたい場合は、次の何れかの選択になるでしょう。 | ||
| - | * transactional()を使って3つのアクション( '' | + | * クエリーのアクションにもトランザクションを設定する |
| + | * アクション内のcatchブロックでエラーメッセージ付きの入力ページをレンダリングする | ||
| \\ | \\ | ||