CakePHPのモデル機構には、保存するデータを検証するデータバリデーション機能があります。データ形式の指定は、1.1のころはCakePHPに組み込まれているルールと、自作の正規表現でのルールが使用できました。しかしこれでは明らかに力不足で、別のモデルの状態に依存する場合などはコントローラ側でコードを記述する必要がありました。これでは実用上十分とは言えなかったので、1.1の連載ではデータバリデーションは話題にはしませんでした。
1.2からは自作のルールとして、モデルに定義したメソッドにデータとパラメータが渡され、メソッドの返り値によって判定結果を示すことができるようになりました。PHPのコードが書けるため、自由度はほぼ100%あると言えます。十分、実用的となりました。
ただ自作で何でもできるとはいってもすでに便利なルールはたくさんあります。まずはバリデーションの定義方法と、組み込みのルールをざっくりと紹介します。
バリデーション書式の簡単な説明と記述例
バリデーションルールは、対象のモデルクラスの$validateプロパティに記述します。
詳しい書式の説明用に、CakePHP本家のマニュアルより一バリデーション例を一部改変してコメント付きで引用させて頂きました。
定義を1つずつ解説していきます。
ログイン名
まずはログイン名の定義の数に注目してください。2つのルールが定義されています。ルールをAND条件で複数定義する場合は配列を入れ子にすることで表現できます。
定義名(rule1とrule2)はつけてもつけなくても構いませんが、つけておいたほうがプログラムからアクセスしやすいです。たとえば局所的にバリデーションルールを変更したいときなどに対応しやすくなります。複数のルールがある場合は、なるべくつけておくのがよいでしょう。なお、複数定義して複数エラーだったときのエラーメッセージの選択順位は、後に記述したほうが優先されます。
ログイン名の1つ目の定義「rule1」では、英数字限定のルール「alphaNumric」が定義されています。そして、requiredオプションにより「保存(save)するときに必ず必要」と指定されています。
ログイン名の二つ目の定義「rule2」では、ルール名とルールへのパラメータとして文字列の長さの範囲「between」を定義しています。ルールにはパラメータを渡すことができるルールもあるのです。
パスワード
パスワードは最短文字列長が指定されています。なお、ログイン名で定義されていたrequiredオプションがないので、save時に含めなくてもエラーにはなりません。以後のカラムは全てrequiredオプションはありません。
メールアドレス
次にメールアドレスです。最初に説明した書式と違い、カラム名がキーでルール名が値という単純な書式で定義されています。ルールに対してパラメータを渡したりせず、エラー文なども定義しない場合はこれでもよいでしょう。
生年月日
最後の生年月日の項目には、allowEmptyというオプションがあります。allowEmptyにtrueを定義すると、空の文字列が渡されたときにルールに一致していなくてもエラーにならなくなります。
組み込みのバリデーションルール一覧
組み込みのバリデーションルールは中々充実しています。クレジットカード番号や拡張子など多彩なルールがあり憶えきれないので、自作する前には必ず一覧に目を通しておきましょう。
表 組み込みのバリデーションルール
alphaNumeric | 英数字 |
between | 文字数範囲 |
blank | 空文字かホワイトスペース |
boolean | true/falseまたは0か1 |
cc | クレジットカード番号 |
comparison | 数値比較(以上,以下,未満など) |
date | 日付 |
decimal | 少数数値 |
email | メールアドレス |
equalTo | 文字列一致 |
extension | 拡張子 |
ip | IPv4アドレス |
isUnique | テーブル内ユニーク |
minLength | 最小文字列長(byte) |
maxLength | 最大文字列長(byte) |
money | 通貨記号付き金額 |
Multiple | 複数選択 |
inList | 文字列一致(配列から) |
numeric | 数値 |
notEmpty | 空でないか |
phone | 電話番号(執筆現在、usのみ対応) |
postal | 郵便番号(執筆現在、us,uk,ca,it,de,beのみ対応) |
range | 数値範囲 |
ssn | 社会保障番号(執筆現在、us,dk,nlのみ対応) |
url | URL |
それぞれのルールの詳しい説明は組み込みのバリデーションルール(CakePHPマニュアル)から確認することができます。
次回は
ところで文字列長のルールは、最もありふれたバリデーションルールの1つですが、組み込みのルールは日本語などのマルチバイトで構成された文字列には対応していません。そこで次回は、自作ルールとしてマルチバイトな文字列に対応した文字列長/文字列幅のルールの作成手順を紹介いたします。