Home > CakePHP | PHP > CakePHP Model#save()内でvalidates()を呼ばない

CakePHP Model#save()内でvalidates()を呼ばない

  • 2007-04-03 (火) 21:22
  • CakePHP | PHP
  • このエントリーをはてなブックマークに追加
この記事の所要時間: 11

ref: CakePHPの何か-CakePHPのModelを使う

お馴染みyandoさんのプレゼン資料で気になったソースがあったので勝手に添削w。

35p:Validation設定例

PHP:
  1. <?php
  2. class UsersController extends AppController {
  3.   function fuga(){
  4.     $data['User'] = array(
  5.       'login_id' => '+*+*+*+*',
  6.       'password' => 'abcde',
  7.       'name' => ''
  8.       );
  9.       if ($this->User->validates($data)) {
  10.         $this->User->save($data);
  11.       } else {
  12.         $this->validateErrors($this->User);
  13.       }
  14.    }
  15. }
  16. ?>

User#save()の部分ですが、Model#save()メソッド内ではModel#validates()が呼ばれるので、このままだとUser#validates()が2度実行されることになります。

このソースのようにsave()の前にvalidates()を実行するならsave()の第2引数にfalseを渡します。これならsave()内でvalidates()は実行されません。

PHP:
  1. <?php
  2.       if ($this->User->validates($data)) {
  3.         // validates()はsave()内では呼ばれない
  4.         $this->User->save($data, false);
  5.       }
  6. ?>

あとこの例のようにController#validationErrorsを参照しないのなら、Controller#validateErrors()は呼ばなくても良いです。

なので↓のようにシンプルに書けたりします。

PHP:
  1. <?php
  2. class UsersController extends AppController {
  3.   function fuga(){
  4.     $data['User'] = array(
  5.       'login_id' => '+*+*+*+*',
  6.       'password' => 'abcde',
  7.       'name' => ''
  8.       );
  9.       $this->User->save($data);
  10.    }
  11. }
  12. ?>

まあ実際は登録完了後はリダイレクトしたりビューテンプレートを変えたりするので結局上のソースのようになるのですが。;-)

コメント (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
http://www.1x1.jp/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 さて、次はもうちょっとプロフィールページを充実させていったり [...]

Home > CakePHP | PHP > CakePHP Model#save()内でvalidates()を呼ばない

検索
フィード
メタ情報

Return to page top