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でロギングスコープやログレベルを使用してログを出し分ける方法を解説CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
CakePHP4の規約外のカラムをキーにアソシエーション(テーブル連結)する方法
CakePHPで Auto Incrementを外すと Duplicate entry '0' for keyのエラーが出るかも
CakePHPのFlashエラーは出るが入力項目ごとのメッセージが出ないエラーの原因
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。
-
-
CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。
-
-
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3でOGPを設定する方法を解説。fetch、assignを使用しレイアウトファイルに編集した変数にテンプレートファイルから値を指定する。これを利用してOGPを編集する。
-
-
CakePHP 2.3で確認画面付きのお問い合わせフォームの作り方
CakePHPで確認画面付きのお問い合わせフォーム、メールフォームの作り方をサンプルを提示しながら解説。
-
-
CakePHP4のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説
CakePHP4のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
CakePHP 2.3 Model、Controllerの見たい変数の中身をログ出力
CakePHPの Modelや Controllerの変数の中身をログとして出力して見る方法を提供します。
-
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
-
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。