CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
2022/07/16
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
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
cakephp3 カスタムバリデーションを簡易的に実装する方法
CakePHP3の独自のバリデーションをテーブルクラス内に簡単に記述する方法を解説。他のテーブルクラスでは使えないが、記述する量は少なく実装できるため、他で使わない処理を書くのには便利。
-
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
-
CakePHP3のメール送信の処理・テンプレート使用・添付ファイル送信も解説
CakePHP3からメールを送信する方法解説。基本的な記述方法を基にして、テンプレートを使う方法、ファイルを添付する方法へと拡張しながら解説。
-
-
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。
-
-
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。
-
-
CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法
CakePHPで「CakeDC/Users」などルーティングを行うプラグインを利用するときに、favicon.icoやapple-touch-icon-144-precomposed.pngがNotFoundエラーになることがある。その対処方法の解説。
-
-
CakePHP 2.3 ログイン、操作履歴、アクセスログ出力
CakePHPでログインや操作履歴などのアクセスログ出力処理を作成します。
-
-
CakePHP3のユーザ管理・ログイン認証プラグインCakeDC/Usersのインストール解説・3.6以降対応
CakePHP3のユーザ管理プラグイン Usersは、ユーザ登録、メール認証、ログイン認証、ユーザ管理、権限管理、reCAPTCHAなど会員制のサイトを簡単に実現可能。その導入方法、カスタマイズ方法を解説。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!