コントローラ内でバリデーション処理を呼び出す

CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。

バリデーションをsaveから切り出して行う

ポイントは、1.のvalidatesの前にデータ($this->request->data)をdataをModelにsetする必要があるところです。(「若干異なる処理体系」とはここのことです。)この処理を行わないとvalidatesは常にtrueを返します。
validatesメソッド内で、invalidFieldsメソッドが呼び出されます。このメソッドは[Model]->validationErrorsにバリデーションのエラーメッセージ(message)を格納します。バリデーションNGの場合、ここからメッセージの取り出しが可能です。

// 1. モデル[Model]にデータを設定
$this->[Model]->set( $this->request->data );
// 2. モデル[ModelName]のvalidatesメソッドを使ってバリデーションを行う。
if ($this->[Model]->validates()) {
    // バリデーションOKの場合の処理
} else {
    // バリデーションNGの場合の処理
    $this->log( $this->[Model]->validationErrors, LOG_DEBUG);
}

フィールドを限定してバリデーションを行う

fieldListでフィールド名を指定すると、そのフィールドに対してのみにバリデーションを行います。以下の例だとUserモデル内のusernameとpasswordのみ

$this->User->set( $this->request->data );
if ($this->User->validates( array( 'fieldList' => array( 'username', 'password')))) {
    // バリデーションOKの場合の処理
} else {
    // バリデーションNGの場合の処理
}

複数レコードのバリデーション

複数レコードに対してバリデーションを行いたい場合は、saveAllで「'validate' => 'only'」を指定することで実現できます。

if ($this->[Model]->saveAll( $this->request->data, array( 'validate' => 'only'))) {
    // バリデーションOKの場合の処理
} else {
    // バリデーションNGの場合の処理
    $this->log( $this->[Model]->validationErrors, LOG_DEBUG);
}

saveAllの方法は、saveManyの項を参照:saveMany
確認したところ、[Model]->validationErrorsにレコードごとにバリデーションエラーメッセージを格納してくれます。

// 例 $this->log( $this->[Model]->validationErrors, LOG_DEBUG);
Array (
    [0] => Array (
        [field] => Array (
            [0] => error message
        )
    )
    [1] => Array (
        [field] => Array (
            [0] => error message
        )
    )
)

save内のvalidateをスキップ

save前にvalidatesを行った際には、「'validate' => false」を指定することでsave内でのバリデーションを行わなくなります。

// saveもしくはsaveAll
if ($this->[Model]->save( $this->request->data, array( 'validate' => false))) {
    // save OKの場合の処理
}

参考:Validating Data from the Controller

  • このエントリーをはてなブックマークに追加

関連記事

多言語サイト向けに翻訳ファイルを使って翻訳を行う

CakePHPには、翻訳をビヘイビアを使用する方法と翻訳ファイルを使用する方法の2つがあるそうです。(他にもあるのかな?) 今回は、翻訳ファイルを使用して言語の切り替えを行い、その言語設定をCook

Blowfishを使用してハッシュ化する

使用方法 Blowfishを採用してハッシュ化を行う場合、Securityクラスのhashメソッドを呼び出します。第2引数に'blowfish'を指定し、第3引数を指定しないもしくはfalseにしま

Cookieログイン

今回は、ログイン画面でよくみかけるクッキーログインの機能を使ってみます。 CakePHPには、Cookieコンポーネントがあります。(PHPのsetcookieメソッドのラッパー)メソッドはwr

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

(メール・URL・電話・郵便・IP) データ バリデーション

今回は、プロフィール情報に使用されるデータに絞ったバリデーションルールです。 バリデーションルール 以下の5つのバリデーションルールがコアに用意されています。 email メールアドレス

no image

radioボタンを実装

Radioボタンの実装は、セレクトボックスとほぼ同じです。 個人的にはラジオボタンをすすんで使用することは少ないのですが、2択くらいの選択肢であれば非常に便利ですよね。 今回は、その実装方法 デモ

数値系バリデーション

CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること

SQLクエリーをログに出力する

SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処

checkボックスを実装

selectボックスに引き続いてcheckボックスの実装方法をおさらいしてみます。 コードは、CakePHP 2と1.3両方で実装可能です。デモ モデルは、こちらも以下 CREATE TA

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

Comment

Message

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

*

PAGE TOP ↑