ref: CakePHPの何か-CakePHPのModelを使う
お馴染みyandoさんのプレゼン資料で気になったソースがあったので勝手に添削w。
35p:Validation設定例
<?php class UsersController extends AppController { function fuga(){ $data['User'] = array( 'login_id' => '+*+*+*+*', 'password' => 'abcde', 'name' => '' ); if ($this->User->validates($data)) { $this->User->save($data); } else { $this->validateErrors($this->User); } } } ?>
User#save()の部分ですが、Model#save()メソッド内ではModel#validates()が呼ばれるので、このままだとUser#validates()が2度実行されることになります。
このソースのようにsave()の前にvalidates()を実行するならsave()の第2引数にfalseを渡します。これならsave()内でvalidates()は実行されません。
<?php if ($this->User->validates($data)) { // validates()はsave()内では呼ばれない $this->User->save($data, false); } ?>
あとこの例のようにController#validationErrorsを参照しないのなら、Controller#validateErrors()は呼ばなくても良いです。
なので↓のようにシンプルに書けたりします。
<?php class UsersController extends AppController { function fuga(){ $data['User'] = array( 'login_id' => '+*+*+*+*', 'password' => 'abcde', 'name' => '' ); $this->User->save($data); } } ?>
まあ実際は登録完了後はリダイレクトしたりビューテンプレートを変えたりするので結局上のソースのようになるのですが。;-)
- Newer: PostgreSQL 誤って削除したデータを復元する
- Older: URLをリンクにするSmartyプラグイン
コメント (Close):2
- yando 07-04-04 (水) 1:30
-
添削ありがとうございますー。
ぱっとみてイメージを伝える為にソースは結構判定とかはしょってます。
なので2回validateしてる自覚はありました。
(まぁ成功時の判定を2回通ってもクリティカルじゃないだろう・・・と)ただsaveするだけのソースで暗黙的にvalidateする例と
並べる形の構成にしたほうが良かったかもです。
勉強になりました。 - shinbara 07-04-04 (水) 10:56
-
> ぱっとみてイメージを伝える為にソースは結構判定とかはしょってます。
ですよね。
プレゼン用のソースに突っ込むのもどうかwと思いつつ気になったので書いてみました。;-)私も普段はvalidates()してからsave()を呼ぶのですが、save()内のvalidates()呼び出しを無効化するのにソースを確認した事があったんで。
トラックバック:1
- このエントリーのトラックバックURL
- /blog/2007/04/cakephp_save_validates.html/trackback
- Listed below are links to weblogs that reference
- CakePHP Model#save()内でvalidates()を呼ばない from Shin x blog
- pingback from CakePHPのお勉強(#020) « kichon's blog 10-12-16 (木) 18:37
-
[…] http ://cakephp.hamazo.tv/e1577376.html http://blog.ecworks.jp/archives/792 http://www.1×1.jp/blog/2007/04/cakephp_save_validates.html さて、次はもうちょっとプロフィールページを充実させていったり […]