CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
2023/12/28
CakePHP4でcontrollerで実行したバリデーションエラーは「setError()」「setErrors()」でセットする
CakePHP4では強力なバリデーション(入力チェック)機能が用意されていますので、簡単にいろいろなバリデーションを組み込むことができます。
通常のバリデーションは Modelの中に記述します。
(src/Model/Table/ArticleTable.php 内の validationDefault()に記述します。)
ですが、この記事では、独自のバリデーションを controller内に記述する際の処理について解説します。
独自のバリデーションを controller内に記述し、その処理で発生したエラーを Model内のバリデーションの結果に追加して(エンティティにエラーをセットして)、まとめてバリデーションのエラーとして画面に表示したい、という場合の方法についての解説となります。
この記事は、CakePHP4について書いていますが、CakePHP3でも同様に記述することで同様の処理を行うことができます。
エラーのセットは「setError()」「setErrors()」を使う
エラーのセットは、下記の 16行目のように「setError()」を使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public function add() { $topic = $this->Topics->newEmptyEntity(); if ($this->request->is('post')) { // アップロードしたファイル情報を取得 $file = $this->request->getData("file"); // アップロードファイルのバリデーション $fileResponse = $this->CheckFile($file); // アップロードファイルのバリデーション結果の処理 if(!empty($fileResponse)){ $fileError = $fileResponse["error"]; // エラーメッセージをセット $topic->setError("file",[$fileError]); } else { $filePath = WWW_ROOT . "upload" . DS . $file->getClientFilename(); $file->moveTo($filePath); $topic["file"] = $filePath; } $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')); } |
上記は「Topics」というテーブルにファイルをアップロードする処理があり、そのアップロードしたファイルのバリデーションを controller(内にある関数)で実行し、エラーが発生したら「setError()」を使用して、エラーメッセージをセットする、という処理です。
9行目でアップロードしたファイルをチェックする独自のバリデーション関数「$this->CheckFile()」を使ってバリデーションを行います。
12行目でエラーの有無をチェックして、エラーが発生した場合は、16行目の「setError()」にメッセージをセットしています。
セットされたエラーメッセージは上記のような感じで、Modelのバリデーションと同じように表示されます。
「setError()」と「setErrors()」の使い方
controllerの処理で確認したエラーをエンティティにセットするには「setError()」と「setErrors()」を使用します。
「setError()」と「setErrors()」の違いは下記のようになっています。
「setError()」は 1つのフィールドのエラーを記述
「setErrors()」は、複数のフィールのエラーをまとめて記述
「setError()」の使い方
「setError()」の使い方は下記のようになります。
1 |
$topic->setError("フィールド名",["エラーメッセージ1","エラーメッセージ2"]); |
1つめのパラメータに「フィールド名」を記述し、2つ目のパラメータに「エラーメッセージ」を「配列」で記述します。
エラーメッセージは配列で指定しますので、エラーメッセージが複数ある場合は配列で指定すれば OKです。
Model側の処理でもバリデーションは実行され、発生したエラーは追加されますので、Model内と controller内と区別されることなく、入力画面にエラーメッセージが表示されます。
「setErrors()」の使い方
「setErrors()」の使い方は下記のようになります。
1 2 3 4 |
$topic->setErrors([ "フィールド名1" => ["エラーメッセージ1-1","エラーメッセージ1-2"], "フィールド名2" => ["エラーメッセージ2-1","エラーメッセージ2-2"] ]); |
「setError()」とほとんど同じですが、複数のフィールドのエラーをまとめて記述することができるようになっています。
参考資料
この記事を書く際に参考にしたオフィシャルの Cookbookの URLを記載しておきます。
https://book.cakephp.org/3/ja/orm/entities.html#id8
https://book.cakephp.org/4/ja/orm/entities.html#id8
https://api.cakephp.org/4.1/class-Cake.ORM.Entity.html
CakePHP4の関連記事
CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
WYSIWYGエディタであるCKEditor4をCDNを利用して簡単にCakePHP3に導入する方法とカスタマイズする方法を解説。CakePHP3にはページごとの振り分けを行うブロック化を利用する。
-
-
国際化と地域化の翻訳機能「__()」を使って定数に変数を埋め込む方法
CakePHP4で定数に変数を埋め込み、翻訳機能「__()」で変数に値を入れる方法を紹介。定型の文章の一部だけを置換したい場合に利用すると便利。
-
-
CakePHP3のインストールでURL rewriting……のエラーが!その解決方法解説
CakePHP3をインストールしたら URL rewriting is not properly configured.のエラーが。原因は.htaccessが有効になっていないこと。httpd.confに設定を追加すればOK。
-
-
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。
-
-
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
CakePHPのデバッグ用のツールであるDebugKitは適切な設定をしないとエラーログにワーニングメッセージが出力される。それを解消する方法を解説。
-
-
CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
CakePHP3でシステム開発をする際、途中でカラムを追加した場合に何を変更すればいいかを確認。カラムを追加する前後で Bakeした結果を比較し、変更になった点をリストアップした。
-
-
CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
CakePHP4でバッチ処理を行うためのコマンド・シェルの実装方法について解説。bakeでテンプレートファイルを作成し、「execute()」に処理を記述する方法を解説。
-
-
getParam('action')
で取得するアクション名は別関数に移動しても不変CakePHP4系、5系では「getParam()」で処理中のアクション名を取得できる。そのアクションから別関数を呼び出してた関数でアクション名を調べたが同一の名称だった。
-
-
CakePHP3の画像、ファイルアップロードプラグインUpload Plugin 3.0の設置解説・その1
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその1で基本的な導入方法の解説で読みながら簡単に導入が可能。
-
-
CakePHP4で「app_local.php」「.env」を利用して環境ごとの定数を振り分ける方法
CakePHP4で.env、app_local.phpに定数を定義してそれを呼び出す方法の解説。Gitでは管理せず本番環境と開発環境とで異なる定数を定義するためそれを利用する方法。