CakePHP & PHP 2006/08/10 18:17
CakePHP – validate
CakePHPでのvalidateネタ。
validateは入力チェック正規表現をmodelの$validateに配列で設定しておくだけなんだけど、メールアドレスの重複チェックなんかはそのままではどうにもできない。
modelの$validateに正規表現ではなく、(入力チェック)メソッド名を入れとけばそれを呼んでくれたりするのかな、と思ったがそれはナシ。
マニュアルではcontrollerで重複チェックを行う方法が載っているだが、正規表現でのチェックはmodelにあるので一緒にmodel内に書きたいところ。
で、考えたのが以下の3つの方法。
- model#beforeValidate()に書く
正規表現での入力チェックより先に呼ばれてしまう。
一意チェックなんかではDBアクセスが発生するから正規表現でのチェックを通過したものだけ処理を行う方が良い。 - model#validates()に書く
parent::validates()を呼んでから、独自入力チェックを書く。
validates()内に入力チェックが集約されるからよさげ。
ただparent::validate()を忘れると正規表現での入力チェックが呼ばれなくなる。 - model#beforeSave()に書く
validates()の後に呼ばれるので正規表現での入力チェックを通過した際のみ呼ばれる。
どの方法でもいちおう動作はするが、1.はイマイチなんで、2.か3.のどちらか。
メソッドの意味的には2.が良いかな。
メモ:
入力エラー時に↓みたいにinvalidate()を呼ぶのだが、引数に注意。
$this->invalidate('username');
この値は単にviewでtagErrorMsg()を呼ぶときに使用するものなのでmodel(DB)のフィールド名(カラム名)と合わせる必要は無いんで。(ちょっとハマッた)
■Related Posts
- No related posts





on 10 8月 2007 at 19:19 1.am11op said …
こんにちは。いつも参考にしてます。
本文中3. の方法だと Model::save の第2引数に false を渡して
validation をスキップしたい時にも実行されてしまうので、
2. の方法がベストかもですね。
↓API for CakePHP
http://api.cakephp.org/1.2/class_model.html#ebe42ae387be89985b5a35dd428f5c81
on 13 8月 2007 at 18:04 2.shinbara said …
am11opさん:
こんにちは。
これを書いた頃はModel#saveにfalseを渡すことを想定していなかったのですが、
今となっては3.はvalidationするには向かないですね。
使う人が増えてきたのでベストプラクティスが共有できれば良いですね。;-)