エス技研

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


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

    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()」にメッセージをセットしています。
 
 
CakePHP4でcontrollerで実行したバリデーションエラーをmodelのにマージする方法
 
セットされたエラーメッセージは上記のような感じで、Modelのバリデーションと同じように表示されます。
 
 

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

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

「setError()」の使い方

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

$topic->setError("フィールド名",["エラーメッセージ1","エラーメッセージ2"]);

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

「setErrors()」の使い方

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

$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の関連記事

CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法
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」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

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

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

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

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

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

  関連記事

CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能

CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。

CakePHP3のForm Helperの使い方のまとめ

CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。

CakePHP 2.3 ログイン、操作履歴、アクセスログ出力

CakePHPでログインや操作履歴などのアクセスログ出力処理を作成します。

CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説

CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。

CakePHP 2.x系 Viewでのコメントの記述方法など

CakePHPにおいて View、ctpファイルでコメントを記述する方法を解説。

CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」

CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。

CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法

CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。

CakePHP 2.3でOn Duplicate Key構文を実装

CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。

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

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

CakePHP3でPHPExcelを使ってエクセルファイルを生成、出力する方法

CakePHP3でPHPExcelを利用してエクセルを編集、出力するサンプルソース+解説。PHPExcelのインストール方法の解説からファイル保存とダウンロードの方法なども解説。