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

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

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

関連記事

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

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

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

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

数値系バリデーション

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

RSSフィードの取得

コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://

Markdown Plugin

「Markdown CakePHP Plugin」は、MarkDown書式をレンダリングしてくれるビューヘルパーです。MarkDownについて勉強しているうちに出会ったので試し打ちです。 ダウンロー

DebugKitを導入

定番のブログチュートリアルをこなして、定番のDebugKitを導入してみました。 2.3からはCakePHPインストール直後に以下のように導入を推奨するような警告メッセージが表示されるようになりまし

CakePHP 2.x インストール

現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ

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

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

Js/Cssファイルの読み込みや出力する方法

CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン

Cookieログイン

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

Comment

Message

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

*

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

PAGE TOP ↑