コントローラーからのバリデーション

通常は単にモデルの save メソッドを使うことが多いと思いますが、時には データを保存せずにバリデーション(妥当性チェック)だけをやりたいという ケースもあるかもしれません。たとえばデータベースに実際にデータを保存 する前に、なんらかの追加情報を表示したい場合もあるでしょう。 バリデーションには単なるデータの保存とは若干異なる処理が必要です。

まず、データをモデルにセットします:

$this->ModelName->set($this->request->data);

そしてバリデーションするにはモデルの validates メソッドを使います。 これはデータが正しければ true 、エラーがあれば false を返します:

if ($this->ModelName->validates()) {
    // 正しい場合のロジック
} else {
    // 正しくない場合のロジック
    $errors = $this->ModelName->validationErrors;
}

モデルで指定されているバリデーションのうちの、一部だけを適用 したい場合もあると思います。たとえば User というモデルがあって、 その中に first_name, last_name, email, password という項目が あるとします。ユーザを作成または編集するためのインスタンスでは、 4 項目すべてのバリデーションを行うべきですね。一方ユーザがログイン する際は email と password のルールだけをチェックすれば済みます。 これを行うには、チェックする項目を指定したオプション配列を渡して あげます:

if ($this->User->validates(array('fieldList' => array('email', 'password')))) {
    // バリデーションOK
} else {
    // バリデーションNG
}

validates メソッドは invalidFields メソッドを呼び出しますが、 この中でモデルの validationErrors プロパティを設定します。 invalidFields はまた、そのデータを結果として返します:

$errors = $this->ModelName->invalidFields(); // validationErrors 配列を返す

バリデーション結果のエラーリストは一連の invalidFields() の 呼び出しの間はクリアされません。このため、ループの中でバリデーション を行っている際にそれぞれのエラーを個別に取得する場合は、 invalidFields() を使ってはいけません。その代わりに validates() を使い、モデルのプロパティである validationErrors にアクセス してください。

重要な点としては、データのバリデーションを行うにあたり、事前にその データはモデルにセットされていなければならないということです。 これは、データがパラメータとして渡される save メソッドとは異なります。 さらに、必ずしも save の前に validates を呼ぶ必要もありません。 これは、save では実際にデータの保存をする前に、自動的にバリデーション が行われるためです。

複数のモデルのバリデーションを行うには次のアプローチを使います:

if ($this->ModelName->saveAll(
    $this->request->data, array('validate' => 'only')
)) {
  // データは有効
} else {
  // データは無効
}

もし save の前に妥当性チェックが終わっていれば、二度目のチェックを 省略することができます:

if ($this->ModelName->saveAll(
    $this->request->data, array('validate' => false)
)) {
    // チェックを省略して保存する
}