エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHP3で保存前にバリデーション結果を取得する2つの方法

      2019/06/08

CakePHP3で保存前にバリデーション結果を取得する「$topic->errors()」と「$topic->hasErrors()」の 2つの方法

 
CakePHP3で、データベースに値を保存する前にバリデーションの結果を取得し、その結果によって処理を振り分けたい、そんな場合の方法について解説します。
 
 

解説のためのサンプルのテーブル

 
例えば、下記のような「トピックス」のテーブルがあったとします。
 

CREATE TABLE `topics` (
  `id`          int(11)  NOT NULL AUTO_INCREMENT,
  `topics_date` date     NOT NULL,
  `title`       text     NOT NULL,
  `body`        text     NOT NULL,
  `created`     datetime NOT NULL,
  `modified`    datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 
 
このテーブルに対して、「bin/cake bake all topics」で bakeして出来上がった「TopicsController.php」の add()アクションが以下になります。
 

public function add()
{
    $topic = $this->Topics->newEntity();
    if ($this->request->is('post')) {
        $topic = $this->Topics->patchEntity($topic, $this->request->getData());
        if ($this->Topics->save($topic)) {
            $this->Flash->success(__('The topic has been saved.'));
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The topic could not be saved. Please, try again.'));
    }
    $this->set(compact('topic'));
}

 
この処理の中の 5行目の
$topic = $this->Topics->patchEntity($topic, $this->request->getData());
の部分で入力された値に対してバリデーションを行っています。
 
その次の
$this->Topics->save($topic)
の部分ではデータベースへの保存処理を行っています。
 
 
つまり、保存する前にバリデーションの結果を判定したい場合は「$topic = $this->Topics->patchEntity($topic, $this->request->getData());」の結果を取得している「$topic」の中身を見て判定します。
 
 
中身を取得する方法は、下記の 2つがあります。
 

  • $topic->errors();
  • $topic->hasErrors();

 

 

$topic->errors(); で取得する場合

 
$topic->errors();」では、エラーがある場合はエラーメッセージを取得することができます。
 
例えば、
エラーがある場合は、下記の様にエラーがある項目名とエラーメッセージが取得できます。
Array ( [title] => Array ( [title] => 20文字以下にしてください。 )
 
エラーがない場合は、下記の様に空の配列になります。
Array ( )
 
 

$topic->hasErrors(); で取得する場合

 
$topic->hasErrors();」では、エラーの有無だけを取得することができます。
 
例えば
エラーがある場合は、「1(true)」
エラーがない場合は、「null」
を取得することができます。
 
 

バリデーションの判定を行う方法

 
以上のことから、バリデーションの結果の有無だけをチェックして処理を行うのであれば、いずれの場合も同じような記述方法でチェックをすることができます。
 

// $topic->errors() を使う場合
if ( $topic->errors() ) {
	// エラーのときの処理
} else {
	// 正常のときの処理
}

// $topic->hasErrors() を使う場合
if ( $topic->hasErrors() ) {
	// エラーのときの処理
} else {
	// 正常のときの処理
}

 
 

テーブルに値を保存する前にバリデーションを行うサンプルプログラム

 
最初に掲示した add()アクションに追記したものが下記になります。
わざわざ書くほどのものでもないですが...
 

public function add()
{
    $topic = $this->Topics->newEntity();
    if ($this->request->is('post')) {
        $topic = $this->Topics->patchEntity($topic, $this->request->getData());

        if ( $topic->hasErrors() ) {
            // エラーのときの処理
        } else {
            // 正常のときの処理
        }

        if ($this->Topics->save($topic)) {
            $this->Flash->success(__('The topic has been saved.'));
            return $this->redirect(['action' => 'index']);
        }
        $this->Flash->error(__('The topic could not be saved. Please, try again.'));
    }
    $this->set(compact('topic'));
}

 
 
ほぼ同じ内容の記事ですが、自分で過去に書いた記事を見つけることができずにまた書いてしまっていました。
以前書いた記事は、下記にあります。
「newEntity()」でも「patchEntity()」でもバリデーションは行われている、という内容ですね。
CakePHP3で値を入力直後にバリデーションする方法解説
 
 
また、今回の記事では、バリデーションを実行した結果を取得する方法でしたが、データベースに保存する際のエラーを「try + catch 構文」で取得する方法については下記に記事を書いていますので参考にしてください。
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
 
 

CakePHP3の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
 
その他の「CakePHP3」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

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

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い

CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。

CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順

CakePHP3で「1対多」の連携を中間テーブルを利用した「多対多」の連携に変更するときの手順のまとめ。中間テーブルの設定やModelの変更などを間違いやすい箇所を指摘しながらの解説。

CakePHP3のCakeDC/Usersのログイン後のリダイレクトを設定解説
CakePHP3のCakeDC/Usersのログイン後のリダイレクトとユーザ権限管理の設定解説

CakeDC謹製Usersプラグインの紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。

CakePHP3のバージョンを指定してインストールする詳細な手順を解説
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説

CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。

CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法

CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。

CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4から外部のデータベースにアクセスする方法解説

CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。

CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。

CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。

CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法

CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。

CakePHP 2.3 Search Pluginで検索処理 その1設置方法

CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。