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)のフィールド名(カラム名)と合わせる必要は無いんで。(ちょっとハマッた)
コメント (Close):2
- am11op 07-08-10 (金) 19:19
-
こんにちは。いつも参考にしてます。
本文中3. の方法だと Model::save の第2引数に false を渡して
validation をスキップしたい時にも実行されてしまうので、
2. の方法がベストかもですね。↓API for CakePHP
http://api.cakephp.org/1.2/class_model.html#ebe42ae387be89985b5a35dd428f5c81 - shinbara 07-08-13 (月) 18:04
-
am11opさん:
こんにちは。
これを書いた頃はModel#saveにfalseを渡すことを想定していなかったのですが、
今となっては3.はvalidationするには向かないですね。使う人が増えてきたのでベストプラクティスが共有できれば良いですね。;-)
トラックバック:0
- このエントリーのトラックバックURL
- /blog/2006/08/cakephp_validate.html/trackback
- Listed below are links to weblogs that reference
- CakePHP – validate from Shin x blog