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

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

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

関連記事

ログインに追加の条件を付与する「scope」

ユーザ登録では、仮登録処理(status=1)から送付したメール内のリンクをクリックしてもらい本登録(status=0)を行ってもらう実装をしました。仮登録の状態ではログインできないように実装するには

Cookieログイン

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

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

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

CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」

「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し

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

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

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

Markdown Plugin

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

RSSフィードの取得

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

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

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

CakePHP インストール時エラーの対処

CakePHPインストール時に出くわすであろうエラーの原因と対処方法についてまとめてみました。前提として、WebサーバはApache、データベースはMySQLとしています。 Timezone未設

Comment

Message

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

*

PAGE TOP ↑