データのバリデーション

Posted by muchag | CakePHP |
初回投稿:2011-06-10 (金) 18:59:58 | 最終更新:2011-07-05 (火) 16:39:25


The CakePHP 1.3 Book:4.1 データのバリデーション(Data Validation)

【環境】
[CakePHP] 1.3.8
バリデーションを行う場所

CakePHP では、データのバリデーションを行うのは
モデルが基本。

でも、コントローラでやってもよい。
 

モデルで行う場合

モデルのフィールド(プロパティ)にて $validate 配列を設定。
 

書式
基本
  1. public $validate = array('fieldName' => 'ruleName');

バリデーションを行うフィールドの名称をキーとし
バリデーション内容を値とする。
 

1フィールド1ルール
  1. public $validate = array(
  2.     'fieldName1' => array(
  3.         'rule' => 'ruleName', // または: array('ruleName', 'param1', 'param2' ...)
  4.     )
  5. );

ruleName は任意。
後述の定義済みルールを利用する場合は、その名称。
 

1フィールド多ルール
  1. public $validate = array(
  2.     'fieldName' => array(
  3.         'ruleName' => array(
  4.             'rule' => 'ruleName',
  5.             // like on, required, 等、他のキーをここに書く...
  6.         ),
  7.         'ruleName2' => array(
  8.             'rule' => 'ruleName2',
  9.             // like on, required, 等、他のキーをここに書く...
  10.         )
  11.     )
  12. );

ruleName は任意。
後述の定義済みルールを利用する場合は、その名称。
 

キー

The CakePHP 1.3 Book:4.1.4 組み込みのバリデーションルール(Validation Rules)
 

rule

ルール内容を記述する場所。

ボリュームが多いので別ページに。
rule 編
 

message

バリデーションエラーを起こしたときに表示する文言。

モデルの $validate プロパティでは国際化は行えない。
 

on

新規時か更新時か、バリデーションを行うタイミングを設定できる。

  1. public $validate = array(
  2.     'fieldName1' => array(
  3.         'rule' => 'ruleName',
  4.         'on' => 'create', // または 'update'
  5.     )
  6. );

 

allowEmpty

分かりやすいサイトを発見。
Ivystar:バリデーションのallowEmptyとrequiredを解説してみる

デフォルト値は null
 

required

分かりやすいサイトを発見。
Ivystar:バリデーションのallowEmptyとrequiredを解説してみる
 

last

デフォルトでは、CakePHP は宣言された全てのバリデーションルールを使用して、フィールドをバリデートしようとし、最後に失敗したルールのエラーメッセージを返します。
しかし、キー「last」の値が「true」といるものが失敗した場合、このルールのエラーメッセージが返され、後ろのルールはバリデートされません。
ですので、最初に失敗したルールのエラーメッセージを表示したい場合は、それぞれのルールに ‘last’ => true をセットしてください。

The CakePHP 1.3 Book:4.1.3 1個のフィールドに複数のルールを定義する

 
ちょっとピンときてなかったけど、試してみてわかった。

バリデーションルールはフィールド毎に設定する。
 ↓
コントローラ(あるいはビュー)に戻せる
エラーメッセージは各フィールド毎に1つ。
 ↓
1つのフィールドに対して複数のエラーが見つかっても
最後に見つかったエラーメッセージが戻ってくる。
 ↓
それよりも先に表示させたいエラーメッセージがある場合は
そのバリデーション項目に ‘last’ => true, を設定する。

という使い方のようだ。
 

コントローラで行う場合

The CakePHP 1.3 Book:4.1.6 コントローラ(Controller)からデータのバリデーションを実行する

  1. $this->ModelName->set( $this->data );
  2. // $this->ModelName->set( $this->data['ModelName'] ); // この書式でも動作する
  3.  
  4. if ( $this->ModelName->validates() ) {
  5.     // バリデーションが成功した場合のロジックをここに書く
  6. } else {
  7.     // バリデーションが失敗した場合のロジックをここに書く
  8. }

 

エラーメッセージを取得
  1. $errors = $this->ModelName->validationErrors;
  2.  
  3. または
  4.  
  5. $errors = $this->ModelName->invalidFields(); // validationErrors 配列を含むデータを取得した

どちらにしても同じ配列であり

  1. $errors['FieldName'] = エラーメッセージ;

という書式になっている。

が、わざわざ $errors 配列を定義して値を受け取らなくても
ビューにて

  1. echo $formEx->error('username');

のように設定しフィールド名を間違えなければちゃんと出力される。
 

Message.auth
  1. if ( $session->check('Message.auth') ) $session->flash('auth');

どこかのサイトに載っていたのだけれども
これもエラーメッセージを取得する手法のはず。

でも、どうやってよいのか分からず仕舞い。
 
<参考元サイト>
CakePHPまとめ:Validation(バリデ-ション)
 

エラーメッセージの国際化
  1. public $validate = array(
  2.     'fieldName1' => array(
  3.         'rule' => 'ruleName',
  4.         'message' => __('Error Message.', true),
  5.     )
  6. );

と素直に書いても

syntax error, unexpected ‘(‘, expecting ‘)’

となってしまう。
 

ビューで設定する手法

モデルとビューで役割分担をする。
 

モデル

モデルにはルールだけを記述。

  1. public $validate = array(
  2.     'fieldName' => array(
  3.         'ruleName' => array(
  4.             'rule' => 'ruleName',
  5.         ),
  6.         'ruleName2' => array(
  7.             'rule' => 'ruleName2',
  8.         )
  9.     )
  10. );

 

ビュー

ビューにはエラーメッセージだけを記述。

  1. echo $form->input(
  2.     'fieldName1',
  3.     array(
  4.         'type' => 'text',
  5.         'error' => array(
  6.             'ruleName' => __('Error Message', true),
  7.             'ruleName2' => __('Error Message2', true),
  8.         )
  9.     )
  10. );

 
The CakePHP 1.3 Book:4.1.3 1個のフィールドに複数のルールを定義する
 

モデルで設定する手法
  1. public $validate = array(
  2.     'fieldName' => array(
  3.         'ruleName' => array(
  4.             'rule' => 'ruleName',
  5.         ),
  6.         'ruleName2' => array(
  7.             'rule' => 'ruleName2',
  8.         )
  9.     )
  10. );
  11.  
  12. public function __construct()
  13. {
  14.     parent::__construct();
  15.  
  16.     // バリデーションエラーメッセージを設定
  17.     $this->validate['fieldName1']['ruleName']['message'] = _('Error Message');
  18.     $this->validate['fieldName1']['ruleName2']['message'] = _('Error Message2');
  19. }

 

__() の第2引数

ここで

  1. $this->validate['fieldName1']['ruleName']['message'] = _('Error Message', true);

とすると

_() expects exactly 1 parameter, 2 given

となる。

これは今一理解できていない。
 
参考元サイト:CakePHP Users in Japan 1.2でのバリデーションとその多言語化の方法
 

ビヘイビアを導入する手法

参考元サイト:趣味の延長線 バリデーションエラーメッセージ多言語化
 

バリデーションルールを使い分ける

場合によってバリデーションルールを使い分けたい場合
モデルに必要な種類だけ $validate プロパティを設定しておく。

  1. public $validate = array('fieldName' => 'ruleName');
  2. public $validate1 = array('fieldName' => 'ruleName');
  3. public $validate2 = array('fieldName' => 'ruleName');

バリデーションルールを変更したいタイミングで
コントローラにて設定。

  1. $this->Model->validate = $this->Model->validate1;
  2.  
  3. $this->Model->validates();

 
参考元サイト:なんとなく始めてみた、プログラマー雑記 CakePHPのバリデーションを状況によって使い分ける方法

Posted by muchag | CakePHP |
初回投稿:2011-06-10 (金) 18:59:58 | 最終更新:2011-07-05 (火) 16:39:25

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment