CakePHP3で保存前にバリデーション結果を取得する2つの方法
2019/06/08
CakePHP3で保存前にバリデーション結果を取得する「$topic->errors()」と「$topic->hasErrors()」の 2つの方法
CakePHP3で、データベースに値を保存する前にバリデーションの結果を取得し、その結果によって処理を振り分けたい、そんな場合の方法について解説します。
解説のためのサンプルのテーブル
例えば、下記のような「トピックス」のテーブルがあったとします。
|
1 2 3 4 5 6 7 8 9 |
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()アクションが以下になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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」
を取得することができます。
バリデーションの判定を行う方法
以上のことから、バリデーションの結果の有無だけをチェックして処理を行うのであれば、いずれの場合も同じような記述方法でチェックをすることができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// $topic->errors() を使う場合 if ( $topic->errors() ) { // エラーのときの処理 } else { // 正常のときの処理 } // $topic->hasErrors() を使う場合 if ( $topic->hasErrors() ) { // エラーのときの処理 } else { // 正常のときの処理 } |
テーブルに値を保存する前にバリデーションを行うサンプルプログラム
最初に掲示した add()アクションに追記したものが下記になります。
わざわざ書くほどのものでもないですが...
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。
-
-
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。
-
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
-
CakePHPのバリデーションを入力値・項目の条件によって変える方法を解説
入力された値によってバリデーション(入力チェック)の内容を切り替える。その処理をCakePHPで実装する方法を解説。条件ごとに unset関数を使ってバリデーションを削除する、という方法を採る。
-
-
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
CakePHPのバージョンの調べ方2点を紹介。CakePHP3~CakePHP5は共通だが CakePHP2はフォルダ構成が異なるためコマンドのパスもオプションも異なる。
-
-
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
CakePHP環境にてpostLinkで生成した削除のリンクをクリックしても処理が実行されず、JavaScriptでUncaught TypeErrorが発生。原因は同一IDを複数記述していることだった。
-
-
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHPの日付、日時の型であるdate型、datetime型の最大値は2999-12-31となっている。MySQLは9999年までなので違いがあるので注意が必要だ。
-
-
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4のシステムから他のシステムのデータベースにアクセスをし、SQL文を実行する方法を解説。try-catchでエラーを取得する方法も解説。
-
-
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3でパンくずの指定方法の解説。2つのヘルパーがあるが簡単なHTMLヘルパーを使った方法を、実際の状況に合わせて3つのパターン(エレメント化、ブロック化)にして解説。