validationのタイミング
データの登録や編集処理をおこなう際は当然ながらフォームを使う。フォームから入ってきたデータは、そのままデータベースに格納することもあるが、何らかの処理をしてから格納することもある。例えばパスワードをmd5してから格納する場合などだ。
ある案件でプログラムを組んでいるとき、ふと迷った。パスワードの入力制限(モデルの$validateで指定する)をなんと書けばよいのか・・・。結論からいうと以下のように書いた。
$validate=array(‘password’=>’/^[0-9a-z]{32}$/’);
半角英数小文字32文字で制限、つまりmd5した値だ。
プログラムの大枠はbake.php(実際はdecorate.php)を使って書き出したものを使った。この場合validationはsaveが呼ばれたときに実行される。saveが呼ばれ、validationに成功すると、データはそのままデータベースに格納されるので、validateとsaveの間で処理をはさむことはできない(自分でシコシコ書けば別だが)。
ただしこれだと、パスワードに入力してもらう文字を制限することはできない。だって何を入力してもmd5しちゃえば半角英数32文字になっちゃうからだ。
そこでsaveする直前に以下のような記述を書いた。
if(preg_match(‘/^[0-9a-z]{8}$/’,$this->data[‘Member’][‘password’]){
$this->data[‘Member’][‘password’]=md5($this->data[‘Member’][‘password’]);
}else{
$this->data[‘Member’][‘password’]=”;
}
「半角英数8文字以外が入力されたら空文字列にする」。「これだったら結局モデルでは制限かけなくても一緒かも」とも思ったけど、この方が余計なプログラムを書く手間が省けるので書いておくことにした。
結局decorate.phpで作成したスクリプトを流用して、立派なユーザ管理画面ができた。便利!。