CakePHP用寝ぼけたバリデーションメッセージを起こす
CakePHPのバリデーションは非常に便利だ。1.1時代はかなりショボすぎる感があったけど、1.2になって、直感的にかなり分かりやすいものになった。
具体的に例を出すと、例えばメールフォームがあたっとして、内訳が
があったとする。
それらにバリデーションを入れる場合、例えば件名は空禁止、toはemail形式、本文は最低5文字(実際には5バイト)入力するのを強制する場合は、以下のような内容でモデルを設定することになる。
class Mail extends AppModel {
public $name = 'Mail';
public $validate = array(
// 件名のバリデーション
'subject' => array(
// 空入力
array(
'rule' => array('notEmpty'),
'message' => '件名を入力してください',
'last' => true,
'required' => true,
),
),
// 宛先のバリデーション
'to' => array(
// email形式
array(
'rule' => array('email'),
'message' => '正しいメールアドレスを入力してください',
'last' => true,
'required' => true,
),
),
// 本文のバリデーション
'body' => array(
// 入力文字数
array(
'rule' => array('minLength', 5),
'message' => '最低5バイトは入力してください',
'last' => true,
'required' => true,
),
),
);
記事を書いた後CakePHP武将のecworks_masap氏に言われて気がついたんだけど、1点注意!「5バイト」なんて文字は運用では使わない。ユーザに対して「バイト」なんて単位を書くのはおかしいからだ。しかしここではあくまで例として(minLengthを使ったため)コードとの整合性を重視し、あえて「5バイト」と書いてみた。
各フィールド名の中には複数の条件を入れることができる。そしてそれらの条件1個1個に名前を付けることもできるが、今回は1つのフィールドに1個しか条件を入れてないので、特に名前は付けていない。
だから、'subject' => array()の中にいきなりarray()で条件をかいている。
各条件のコメント分にも書いてあるような内容を名前にしておくとあとで便利になる場合がある。もしくは厳密に名前を独自に付けることによるコントローラ側でのバリデーション判別などする場合も便利になる。具体的には以下のように、いきなり
array()ではなく、名前を指定してarray()を代入する。
'subject' => array( 'empty_case' => array( 'rule' => ・・・・・・ 'required'=> true));