CakePHP1.2 Model::validates($data)の罠

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

カテゴリー CakePHP, PHP | タグ   | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です