save系のmodelメソッドはvalidate処理を含む
CakephpのsaveやsaveAllはvalidationを内部で実行している
saveやsaveAllだけでなく、saveAssociatedなども同様に内部でvalidationを実行している。
if( $this->Model->save(h($this->data)) ) { } else { }
saveで一括してvalidate処理まで行ってくれるので便利ではある。上の処理でvalidateがokであればデータベースに値まで格納してくれる。しかし、データベースに値を入れたくない場合はどうすればよいだろうか?
Modelのバリデーションのみ行いdbに値を入れたくない場合がCakephpを利用していると遭遇する。saveメソッドはdbに値を入れることを主体に考えたメソッドであり、validationをオフにすることは可能。
Modelのvalidatesメソッドを利用する前にsetする
validationのみを利用する場合は、saveではなくvalidatesメソッドを利用する。その前にModelのsetメソッドでvalidation対象のデータをsetする必要がある。
$this->Model->set(h($this->data)); if( $this->Model->validates() ) { }
上のように事前にsetしてあげる必要がある。このように設定することでデータベースに値を格納することなくModelのvalidationが利用できる。
validationのみを利用するシーンとはどのようなケースか?
上でも書いたが、validationとデータの格納(save)を分けたいときに用いられるパターンが多い。例えば、
Ajaxのchangeリクエストを設定したemailのテキストボックスがあり、フォーカスの移動と同時にメールアドレスの妥当性を非同期に検証したい場合などに利用できる。emailの検証はフロント側でも行うことができるが、サーバ側でも実施することが推奨されている。
validateメソッドを利用してModelの検証機能を利用できるノウハウはおぼえておきたい。