CakePHPで高速Webアプリ開発

第16回何でもできるようになった1.2のデータバリデーション機能(1/2):基本編

CakePHPのモデル機構には、保存するデータを検証するデータバリデーション機能があります。データ形式の指定は、1.1のころはCakePHPに組み込まれているルールと、自作の正規表現でのルールが使用できました。しかしこれでは明らかに力不足で、別のモデルの状態に依存する場合などはコントローラ側でコードを記述する必要がありました。これでは実用上十分とは言えなかったので、1.1の連載ではデータバリデーションは話題にはしませんでした。

1.2からは自作のルールとして、モデルに定義したメソッドにデータとパラメータが渡され、メソッドの返り値によって判定結果を示すことができるようになりました。PHPのコードが書けるため、自由度はほぼ100%あると言えます。十分、実用的となりました。

ただ自作で何でもできるとはいってもすでに便利なルールはたくさんあります。まずはバリデーションの定義方法と、組み込みのルールをざっくりと紹介します。

バリデーション書式の簡単な説明と記述例

バリデーションルールは、対象のモデルクラスの$validateプロパティに記述します。

<?php
class User extends AppModel {
  var $name = 'User';
  var $validate = array(ここにルールを記述...)
}

基本となる書式は以下の通りです。

var $validate = array(
  '対象カラム名' => array(
    'rule' => 'ルール名 or 自作メソッド名',
    'required' => true or false (必須かどうか), (オプション)
    'allowEmpty' => true or false (空文字でもOKか), (オプション)
    'message' => 'エラー時の文章', (オプション)
  ),
),

詳しい書式の説明用に、CakePHP本家のマニュアルより一バリデーション例を一部改変してコメント付きで引用させて頂きました。

データのバリデーション(CakePHPマニュアル)
<?php
class User extends AppModel {
   var $name = 'User';
   var $validate = array(
     // ログイン名
     'login' => array(
       'rule1' => array(  // 定義名「rule1」
         'rule' => 'alphaNumeric', // 英数字限定
         'required' => true, // 必須
         'message' => 'Alphabets and numbers only', // エラー文
       ),
       'rule2' => array( // 定義名「rule2」
         'rule' => array('between', 5, 15), // 文字列の長さが5~15文字
         'message' => 'Between 5 to 15 characters', // エラー文
       ),
     ),
     // パスワード
     'password' => array(
       'rule' => array('minLength', '8'), // 文字列長が8文字(byte)以上必要
       'message' => 'Mimimum 8 characters long',
     ),
     // メールアドレス
     'email' => 'email', // 妥当なメールアドレスの形式であること
     // 生年月日
     'born' => array(
       'rule' => 'date', // 日付であること
       'message' => 'Enter a valid date',
       'allowEmpty' => true, // 空文字を許可する (日付でなくてもよい)
     ),
   );
}
?>

定義を1つずつ解説していきます。

ログイン名

まずはログイン名の定義の数に注目してください。2つのルールが定義されています。ルールをAND条件で複数定義する場合は配列を入れ子にすることで表現できます。

定義名(rule1とrule2)はつけてもつけなくても構いませんが、つけておいたほうがプログラムからアクセスしやすいです。たとえば局所的にバリデーションルールを変更したいときなどに対応しやすくなります。複数のルールがある場合は、なるべくつけておくのがよいでしょう。なお、複数定義して複数エラーだったときのエラーメッセージの選択順位は、後に記述したほうが優先されます。

ログイン名の1つ目の定義「rule1」では、英数字限定のルール「alphaNumric」が定義されています。そして、requiredオプションにより「保存(save)するときに必ず必要」と指定されています。

ログイン名の二つ目の定義「rule2」では、ルール名とルールへのパラメータとして文字列の長さの範囲「between」を定義しています。ルールにはパラメータを渡すことができるルールもあるのです。

パスワード

パスワードは最短文字列長が指定されています。なお、ログイン名で定義されていたrequiredオプションがないので、save時に含めなくてもエラーにはなりません。以後のカラムは全てrequiredオプションはありません。

メールアドレス

次にメールアドレスです。最初に説明した書式と違い、カラム名がキーでルール名が値という単純な書式で定義されています。ルールに対してパラメータを渡したりせず、エラー文なども定義しない場合はこれでもよいでしょう。

生年月日

最後の生年月日の項目には、allowEmptyというオプションがあります。allowEmptyにtrueを定義すると、空の文字列が渡されたときにルールに一致していなくてもエラーにならなくなります。

組み込みのバリデーションルール一覧

組み込みのバリデーションルールは中々充実しています。クレジットカード番号や拡張子など多彩なルールがあり憶えきれないので、自作する前には必ず一覧に目を通しておきましょう。

 組み込みのバリデーションルール
alphaNumeric英数字
between文字数範囲
blank空文字かホワイトスペース
booleantrue/falseまたは0か1
ccクレジットカード番号
comparison数値比較(以上,以下,未満など)
date日付
decimal少数数値
emailメールアドレス
equalTo文字列一致
extension拡張子
ipIPv4アドレス
isUniqueテーブル内ユニーク
minLength最小文字列長(byte)
maxLength最大文字列長(byte)
money通貨記号付き金額
Multiple複数選択
inList文字列一致(配列から)
numeric数値
notEmpty空でないか
phone電話番号(執筆現在、usのみ対応)
postal郵便番号(執筆現在、us,uk,ca,it,de,beのみ対応)
range数値範囲
ssn社会保障番号(執筆現在、us,dk,nlのみ対応)
urlURL

それぞれのルールの詳しい説明は組み込みのバリデーションルール(CakePHPマニュアル)から確認することができます。

次回は

ところで文字列長のルールは、最もありふれたバリデーションルールの1つですが、組み込みのルールは日本語などのマルチバイトで構成された文字列には対応していません。そこで次回は、自作ルールとしてマルチバイトな文字列に対応した文字列長/文字列幅のルールの作成手順を紹介いたします。

おすすめ記事

記事・ニュース一覧