4.1 データのバリデーション(Data Validation)
あらゆるアプリケーションにおいて、データのバリデーションは重要です。これは、モデルのデータがアプリケーションのビジネスルールに必ず従うようにすることに役立ちます。例えば、パスワードは8文字以上であるとか、ユーザ名は必ずユニークにするといったことが挙げられます。バリデーションを定義することは、フォームの取り扱いをとても簡単にします。
バリデーションの仕組みは多くの異なる場面で使います。 この章ではモデルでの利用、基本的には save() メソッドを呼び出した時の振る舞いについてを説明します。バリデーションエラーをどのように取り扱うかについての詳細な情報は、FormHelperについての項目を参照してください。
データのバリデーションを行うには、まずモデルにバリデーションのルールを作成します。これは、モデルの定義の中の Model::validate 配列で行います。次の例を見てください。
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array();
}
?>
<?phpclass User extends AppModel {var $name = 'User';var $validate = array();}?>
この例では、User モデルに $validate 配列 を追加していますが、バリデーションのルールは何も存在しません。users テーブルに login、password、email、born というフィールドがあるとして、次の例では簡単なバリデーションのルールをこれらのフィールドに加えます。
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' => 'alphaNumeric',
'email' => 'email',
'born' => 'date'
);
}
?>
<?phpclass User extends AppModel {var $name = 'User';var $validate = array('login' => 'alphaNumeric','email' => 'email','born' => 'date');}?>
この例は、モデルのフィールドに対してどのようにバリデーションのルールを追加できるかを表しています。「login」フィールドがアルファベットか数字のみ、「email」は電子メールアドレスとして有効な文字列、「born」は日付として有効な文字列が許可されます。バリデーションルールを定義すると、もしそのルールに従わないデータが送信された時に CakePHP のオートマジック(automagic)はフォームにエラーメッセージを表示します。
CakePHPはバリデーションのルールを多く持ち、それらを使うことは大変簡単です。あらかじめ組み込まれたルールには、電子メールのアドレス、URL、クレジットカードの番号を表すものもありますが、これらは後で説明します。
次の例は、組み込みのバリデーションルールを便利に使うための、より複雑な例です。
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' => array(
'alphanumeric' => array(
'rule' => 'alphaNumeric',
'required' => true,
'message' => 'Alphabets and numbers only'
),
'between' => array(
'rule' => array('between', 5, 15),
'message' => 'Between 5 to 15 characters'
)
),
'password' => array(
'rule' => array('minLength', '8'),
'message' => 'Mimimum 8 characters long'
),
'email' => 'email',
'born' => array(
'rule' => 'date',
'message' => 'Enter a valid date',
'allowEmpty' => true
)
);
}
?>
<?phpclass User extends AppModel {var $name = 'User';var $validate = array('login' => array('alphanumeric' => array('rule' => 'alphaNumeric','required' => true,'message' => 'Alphabets and numbers only'),'between' => array('rule' => array('between', 5, 15),'message' => 'Between 5 to 15 characters')),'password' => array('rule' => array('minLength', '8'),'message' => 'Mimimum 8 characters long'),'email' => 'email','born' => array('rule' => 'date','message' => 'Enter a valid date','allowEmpty' => true));}?>
フィールド「login」に対して、「文字の種類がアルファベットまたは数字」かつ「長さが5文字以上で15文字以下」という2つのバリデーションルールが定義されています。同様に、フィールド「password」は長さが8文字以上であり、「email」は電子メールアドレスとして有効な文字列、「born」は日付として有効な文字列であると定義されています。 また、データがバリデーションのルールに従わない時に、CakePHPは任意のメッセージ表示します。それををどのように追加するかに注目してください。
これまでの例の通り、1個のフィールドは複数のバリデーションのルールを持つことが出来ます。そして、もし使いたいルールが組み込まれていなければ、必要に応じて独自のバリデーションのルールを追加することができます。
さて、ここまででバリデーションがどのように動くかについての概要を説明しました。 次に、これらのルールをモデル中でどのように定義するのかを見ていきましょう。これには、「単純な配列で定義する」、「1個のフィールドに1個のルールを定義する」、「1個のフィールドに複数のルールを定義する」という3つの異なった方法があります。
