エス技研

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


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()」を使用します。
 

 
上記は「Topics」というテーブルにファイルをアップロードする処理があり、そのアップロードしたファイルのバリデーションを controller(内にある関数)で実行し、エラーが発生したら「setError()」を使用して、エラーメッセージをセットする、という処理です。
 
9行目でアップロードしたファイルをチェックする独自のバリデーション関数「$this->CheckFile()」を使ってバリデーションを行います。
12行目でエラーの有無をチェックして、エラーが発生した場合は、16行目の「setError()」にメッセージをセットしています。
 
 
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
 
セットされたエラーメッセージは上記のような感じで、Modelのバリデーションと同じように表示されます。
 
 

「setError()」と「setErrors()」の使い方

 
controllerの処理で確認したエラーをエンティティにセットするには「setError()」と「setErrors()」を使用します。
 
「setError()」と「setErrors()」の違いは下記のようになっています。
 
 「setError()」は 1つのフィールドのエラーを記述
 「setErrors()」は、複数のフィールのエラーをまとめて記述
 
 

「setError()」の使い方

 
「setError()」の使い方は下記のようになります。
 

 
1つめのパラメータに「フィールド名」を記述し、2つ目のパラメータに「エラーメッセージ」を「配列」で記述します。
エラーメッセージは配列で指定しますので、エラーメッセージが複数ある場合は配列で指定すれば OKです。
 
Model側の処理でもバリデーションは実行され、発生したエラーは追加されますので、Model内と controller内と区別されることなく、入力画面にエラーメッセージが表示されます。
 
 

「setErrors()」の使い方

 
「setErrors()」の使い方は下記のようになります。
 

 
「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

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

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

Message

メールアドレスが公開されることはありません。

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

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

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

  関連記事

CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合

CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()

CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。

CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3

CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。

CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法

CakePHPの検索プラグイン Search Pluginの検索処理の中で入力エリア一つで複数の項目を同時に検索する方法を解説。

CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法
CakePHP3で /Layout/defult.ctpにある titleタグ、h1タグを編集する方法

CakePHP3でtitleタグ、h1タグのテキストをデフォルトから変更する方法を解説。テンプレートファイルに「$this->assign()」でテキストを指定して「/Layout/defult.ctp」で受け取る。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法

アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。

VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する。
VirtualBoxにCakePHP3を設置。必要なCentOS、Apache、PHP、MySQL、Composerをインストールし設定する

VirtualBoxにCentOS、Apache、MySQL、PHPをインストールするところから初めてCakePHP3の開発環境を構築する手順を詳細解説。この記事1つで全ての設定が完了する。

CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法
CakePHP2の検索Plugin CakeDC/Searchで重複を省くgroup by(distinct)の実装方法

CakePHP2の検索プラグイン「CakeDC/Search」で、重複レコードを省くgroup by、distinctを使う方法についての解説。設定する場所はpaginatorの条件とするので、find()関数と同じ。