Ground Sunlight

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

ユーザ用ツール

サイト用ツール


apricot:usage:ja:controller

差分

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

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

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:usage:ja:controller [2020/08/26 20:07]
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 ユーティリティ]]
  
行 177: 行 174:
 === インターセプターの登録 === === インターセプターの登録 ===
  
-<code>+<code php>
 $this->intercept('insert', 'UserInterceptor@insert'); $this->intercept('insert', 'UserInterceptor@insert');
 $this->intercept('update', 'UserInterceptor@update'); $this->intercept('update', 'UserInterceptor@update');
行 186: 行 183:
 === トランザクションの適用 === === トランザクションの適用 ===
  
-<code>+<code php>
 $this->transactional('insert','update','delete'); $this->transactional('insert','update','delete');
 </code> </code>
行 335: 行 332:
         $v =(new \Valitron\Validator($inputs));         $v =(new \Valitron\Validator($inputs));
         ->rule('required', ['account','password'])         ->rule('required', ['account','password'])
 +        ->rule('equals','password','password_confirmation')
         ->labels(inputLabels('messages.user.create'));         ->labels(inputLabels('messages.user.create'));
  
行 351: 行 349:
 この例では、Input::all() で入力変数を取得した後に、''Validator'' のインスタンスを生成し、そのインスタンスの ''validate()'' メソッドを使ってバリデーションを実行してます。バリデーションについては[[apricot:usage:ja:validation|次章]]を参照して下さい。 この例では、Input::all() で入力変数を取得した後に、''Validator'' のインスタンスを生成し、そのインスタンスの ''validate()'' メソッドを使ってバリデーションを実行してます。バリデーションについては[[apricot:usage:ja:validation|次章]]を参照して下さい。
  
-バリデーションが失敗した時、withInputs() で入力変数を、withErrors() で[[apricot:usage:ja:validation#validatorerrorbagクラス|バリデーションのエラーバッグ]]をフラッシュ変数に保存します。そして、redirect()で前画面にリダイレクトするレスポンスオブジェクトを生成し、それを返します。Apricotはインターセプターがレスポンスオブジェクトを返した時、コントローラーアクションを呼び出さずに、そのレスポンスをクライアントに返します。+バリデーションが失敗した時、withInputs() で入力変数を、withErrors() で[[apricot:usage:ja:validation#validatorerrorbagクラス|バリデーションのエラーバッグ]]をフラッシュ変数に保存します。そして、redirect()で前画面にリダイレクトするレスポンスオブジェクトを生成し、それを返します。Apricotはインターセプターがレスポンスオブジェクトを返した時、コントローラーアクションを呼び出さずに、そのレスポンスをクライアントに返します。
  
 +バリデーションが成功した時、不要になった入力変数 'password_confirmation' を Input::remove() で削除して処理を終了します。その後、Apricotはコントローラーアクションを呼び出します。
  
 \\ \\
行 358: 行 357:
 ===== トランザクション ===== ===== トランザクション =====
  
-ザ登録画面にトランザクションの機能追加します。トランザクションを作るか否かはアクション設定できるようにします。また、トランザクション機能追加するによりアクションスローる ApplicationException をキャッチして(エラー画面に遷移すことなく)入力画面でエラーメッセージ表示できるようなります。アクションでスロされApplicationException には以下のものあります。+Apricotでは、コントロラのアクションをラップする形で、アクションにトランザクションを適用することができます。Apricotは、トランザクションの適用されたアクションを呼び出す前にトランザクションを開始し、アクションが正常に終了するとそのトランザクションをコミットします。アクションが ''ApplicationException'' 例外をスローした場合、Apricotは、それをキャッチしてエラーログを出力して、アクションの代わりに前画面にリダイレクトレスポンスクライアント返します。これらの処理は全てApricotのフレームワーク内で行われるのでアクションのコディングを最小限にすことできます。
  
-  * 楽観的ロック例外(OptimissticLockException) +\\
-  * 対象レコードが存在しない(レコード更新時および削除時) +
-  * その他のアクションで発生する''Exception'' \\ ( パースエラーなどの ''Error'' は対象外です )+
  
-通常、トランザクションは更新系処理で設定するするので、参照系で発生した全ての例外は集約エラーハンドラで処理されエラー画面が表示されます。この状況を避けたい場合は、次の何れかの選択になるでしょう。+==== トランザクションの適用 ====
  
-  * 参照系アクショントランザクションを設定する +アクショントランザクションを適用するには、以下のように、コンストラターの中で、コの ''transactional()'' 使用しま
-  * アショ内のcatchブックでエメッセージ付きの入力画面レンダリング+
  
-\\+<code php> 
 +class FooController extends Controller 
 +
 +    public function __construct(User $user) 
 +    { 
 +        // トランザクションの適用 
 +        $this->transactional('insert','update','delete'); 
 +        ... 
 +    } 
 +    .... 
 +
 +</code>
  
-==== 使用:ユーントローラ ====+このでは、insert、updateそしてdeteleの各アクションにトランクショを適用しています。このように、''transactional()'' メソッドの引数にアクション名を並べるだけで、トランザクションをアクションに適用することができます。
  
-アクションのトランザクション処理を有効にしたい場合は、コントローラのコンストラクタの中でControllerクラスのtransactional()メソッドを使って、以下のようにします。+\\
  
-  * **transactional( 'action1', ... );**+==== トランザクションの処理 ====
  
-{{fa>folder-open-o}} ** /apricot/app/Controllers ** +以下は、ユーザコントローラの update アクションの例です。
-<code php UserController.php> +
-<?php +
-namespace App\Controllers; +
- +
-use App\Exceptions\ApplicationException; +
-use App\Foundation\Controller; +
-use App\Models\User; +
-use Core\Input;+
  
 +<code php>
 /** /**
- ユーザコントローラ+ Updates a user record. 
 + * 
 + * @param int $id 
 + * @return \Apricot\Foundation\Response
  */  */
-class UserController extends Controller+public function update(int $id)
 { {
-    ...+    $inputs = Input::all();
  
-    /** +    try
-     * ユーザコントローラの生成 +
-     */ +
-    public function __construct()+
     {     {
-        // モデル +        $this->user->update($id, $inputs); 
-        $this->user = new User(); +    } 
- +    catch(ApplicationException $e) 
-        // トランザクションアクション登録 +    { 
-        $this->transactional('insert','update','delete');+        throw $e; 
 +    } 
 +    catch(\Exception $e) 
 +    { 
 +        throw new ApplicationException(__('messages.error.db.update'));
     }     }
  
-    ...+    // Redirects to the user edit page. 
 +    return redirect(route("user/{$id}/edit"));
 } }
 </code> </code>
  
-  * transactional()を使って3つのアクション( ''insert()'', ''update()''''delete()'' )のトランザクション処理が有効になるうに設定していま+この例では、ユーザモデル<nowiki>$this->user</nowiki> の update() メソッドで、ユーザデータ変更しています。updateアクションにはコントローラの transactional() メソッドによってトランザクションが適用されているで、データベースのトランザクションはフレームワークが自動で開始してくれます。 
 + 
 +アクションがしなければならないことは、モデルの例外を捕捉して、ApplicationException をスローすることだけです。フレームワークは ApplicationException またはそれを親に持つ例外のみを捕捉します。それ以外の例外は、集約エラーハンドラーによって補足されシステムエラーになります。即ち、フレームワークは、ApplicationException のみ前画面に戻すリダイレクトレスポンスを生成します。 
 + 
 +モデルは次の場合に ApplicationException をスローします: 
 + 
 +  * 楽観的ロック例外が発生した場合( ''OptimissticLockException'' 
 +  * 対象レコードが存在しない場合(レコード更新時および削除時) 
 + 
 +アクションでは、これ以外の例外が発生した場合は、パースエラーなどの ''Error'' を除き、''ApplicationException'' を生成してそれをスローすべきです。 
 + 
 +=== クエリー例外処理 === 
 + 
 +通常、トランザクションは更新系の処理で設定するするので、クエリーで発生した全ての例外は集約エラーハンドラで処理されエラー画面表示されます。この状況を避けたい場合は、次の何れかの選択になるでしょ。 
 + 
 +  * クエリーのアクションもトランザクションを設定する 
 +  * アクション内のcatchブロックでエラーメッセージ付きの入力ページをレンダリングする
  
 \\ \\
  
apricot/usage/ja/controller.1598440024.txt.gz · 最終更新: 2020/08/26 20:07 by y2sunlight