CakePHP1.2の最新版である、1.2.1.8004にて、Model::validatesをオーバーライドして、モデル毎に独自のバリデーションを持たせていたのだが、いざ実験を行ってみると、全くバリデーションが効いていない。
1 2 3 4 5 6 7 8 | <?php // コントローラー if ( $this ->Model->validates( $this ->data)) { // 検証OK } else { // 検証NG } ?> |
上のように書いて、明らかにエラーになるような値を入力して渡しても、なぜかvalidatesをすり抜けてくる。
ちなみにモデル側は、
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | <?php // モデル function validates( $data = array ()){ if ( empty ( $data )){ $data = $this ->data; } parent::validates( $data ); // 独自のバリデーション if ( count ( $this ->validationErrors) > 0){ return false; } else { return true; } } ?> |
である。独自に定義したバリデーション自体は通っていた。問題は、フレームワークが最初から持っているバリデーションを通っていないということだ。
うーむ、俺はCakePHP1.1のときに、ずっと上記のような書き方をしていたので、全く理由がわからない。
とりあえずググると、こんな記述を発見。
注意:英語のサイトです。
http://lemoncake.wordpress.com/2007/06/26/validation-gotcha-in-cakephp-12/
どうも、$this->Model->validates($this->data)のように引数を渡したのでは、ちゃんと動いてくれないっぽい。確かに、CakePHPポケットリファレンスでも、引数を渡すのは非推奨と書いてあった。validatesをする事前に、setをする必要があるらしい。
1 2 3 4 5 6 7 8 9 | <?php // コントローラー $this ->Model->set( $this ->data); // 事前にsetしておく if ( $this ->Model->validates()) { // 検証OK } else { // 検証NG } ?> |
こうしたら、フレームワークが最初から持っているバリデーション機能を通ってくれた。
CakePHP1.1と1.2で、こんな違いもあるのだな~。それにしても、こんなことに2時間くらい悩んでしまった…。相当ストレスがたまってしまったが、原因がわかったし、解決できたから、報われたっす。
■追記
$this->Model->create($this->data)でもよいという記事があった。
参考情報を以下に載せておく。
1 2 3 4 5 6 7 8 9 | <?php // コントローラー // 新規作成の場合は以下でもよい if ( $this ->Model->create( $this ->data) && $this ->Model->validates()) { // 検証OK } else { // 検証NG } ?> |