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

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

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

関連記事

CakeEmailでメール送信(@gmail)

CakePHP 2になって追加されたクラスCakeEmailがシンプルに使えます。これを使用してメール送信を行う処理を実装してみました。 CakeEmailクラスの読み込み /app/Config

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

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

ネストしたリストを出力「nestedList」

DBやJSONからデータを取得して、そのデータをもとにメニュー表示などネストしたリストを出力させたい場合に「nestedList」が便利です。 ヘルパーに渡すデータは連想配列である必要があります。(

複数ファイルアップロードフォーム

CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (

テーブルからランダムにデータを取り出す(find)

CakePHPでテーブルから特定件数のレコードをランダムに取得するには以下のように指定するとできます。 $this->data = $this->Bulkdata->find( 'all',

ハッシュ関数の選択とハッシュ化処理

CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ

ログローテーション

CakePHP 2.xではbootstrap.php内にあらかじめアプリケーションログの設定が書かれています。2.xで日付ごとにログファイルが切り替わるよう設定してみました。 日ごとにログを切り替え

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

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

hasOne アソシエーション

hasOneアソシエーションはテーブル間で1つのレコードに対して他のテーブルに紐付くレコードが1つの場合にjoinする場合に使用します。 CakePHPのドキュメントにならってUserモデルとP

Cookieログイン

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

Comment

Message

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

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑