CakePHP1.2の最新版である、1.2.1.8004にて、Model::validatesをオーバーライドして、モデル毎に独自のバリデーションを持たせていたのだが、いざ実験を行ってみると、全くバリデーションが効いていない。
<?php // コントローラー if ($this->Model->validates($this->data)) { // 検証OK } else { // 検証NG } ?>
上のように書いて、明らかにエラーになるような値を入力して渡しても、なぜかvalidatesをすり抜けてくる。
ちなみにモデル側は、
<?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をする必要があるらしい。
<?php // コントローラー $this->Model->set($this->data); // 事前にsetしておく if ($this->Model->validates()) { // 検証OK } else { // 検証NG } ?>
こうしたら、フレームワークが最初から持っているバリデーション機能を通ってくれた。
CakePHP1.1と1.2で、こんな違いもあるのだな~。それにしても、こんなことに2時間くらい悩んでしまった…。相当ストレスがたまってしまったが、原因がわかったし、解決できたから、報われたっす。
■追記
$this->Model->create($this->data)でもよいという記事があった。
参考情報を以下に載せておく。
<?php // コントローラー // 新規作成の場合は以下でもよい if ($this->Model->create($this->data) && $this->Model->validates()) { // 検証OK } else { // 検証NG } ?>