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
}
?>
