CakePHP3で値を入力直後にバリデーションする方法解説
2019/03/25
CakePHP3で入力された値を入力直後にバリデーションする処理
CakePHP3の入力チェックは、データベースに情報を保存する際にエラー処理を行っていますが、入力された値を何かしら加工をして、それから保存する場合など、あらかじめ入力チェックをしておきたい、と思う場面もあるでしょう。
そういう場合に、入力直後にバリデーション(入力チェック)を行う処理も用意されていますので、その処理について解説を行います。
CakePHP3で Bakeしたデフォルトの処理
CakePHP3で、リンクの情報を登録する「Links」というテーブルを作成し、Bakeして作成されたデフォルトの処理が下記になります。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function add() { $link = $this->Links->newEntity(); if ($this->request->is('post')) { $link = $this->Links->patchEntity($link, $this->request->data); if ($this->Links->save($link)) { $this->Flash->success(__('The site link has been saved.')); return $this->redirect(['action' => 'index']); } else { $this->Flash->error(__('The site link could not be saved. Please, try again.')); } } $this->set(compact('link')); $this->set('_serialize', ['link']); } |
CakePHP3で入力直後にバリデーションの処理を追加
前項の Bakeで作成されたデフォルトのプログラムに対して、6~10行目、20行目を追加することで、入力の値を受け取った直後にバリデーション処理を実施することができます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public function add() { $link = $this->Links->newEntity(); if ($this->request->is('post')) { $link_check = $this->Links->newEntity($this->request->data); if ($link_check->errors()){ // 入力エラーの処理 $this->Flash->error(__('The site name could not be saved. Please, try again.')); } else { $link = $this->Links->patchEntity($link, $this->request->data); if ($this->Links->save($link)) { $this->Flash->success(__('The site link has been saved.')); return $this->redirect(['action' => 'index']); } else { $this->Flash->error(__('The site link could not be saved. Please, try again.')); } } } $this->set(compact('link')); $this->set('_serialize', ['link']); } |
「newEntity()」で取得する入力値のオブジェクトに対して、受け取った直後にバリデーション(入力チェック)を行う処理を追加しています。
CakePHP3でのバリデーション処理の詳細解説
細かく説明しますと、6行目の「newEntity()」の処理で、リクエストデータを設定します。
|
1 2 3 |
$link = $this->Links->newEntity(); ↓この中に「$this->request->data」を追加 $link_check = $this->Links->newEntity($this->request->data); |
7行目の「$link_check->errors()」で、バリデーション処理で発生したエラーの情報を取得し、エラーがある場合は、エラー処理を行います。
|
1 2 3 4 |
if ($name->errors()){ // 入力エラーの処理 $this->Flash->error(__('The site name could not be saved. Please, try again.')); } |
これにより、入力エラーがある場合は、入力画面に戻り、画面上部にエラーメッセージを表示することができるようになります。
Tableファイルにバリデーションルールを追加
バリデーションのルールの詳細はまた改めて記事を書く予定ですが、バリデーションのルールを追加する場合は、Tableファイルにバリデーションルールを追加します。
下記の例では 8行目に追加しています。
この場合の「not-url」は、バリデーションのルールの名称ですので、他のルール名称とかぶっていなければ、「aaa」「bbb」などでも問題ありません。
※LinksTable.php
|
1 2 3 4 5 6 7 8 9 10 |
public function validationDefault(Validator $validator) { : : $validator ->requirePresence('url', 'create') ->notEmpty('url') ->add("url","not-url",["rule"=>"url","message"=>"Enter a valid URL"]); // ↑この「not-url」はバリデーションのルールの名称 // 他のルールとかぶらないように適当に付ければOK |
バリデーションで出力されるエラー
最後に、「$link_check->errors()」で取得できるエラーについてです。
取得できるエラーは以下のような形となっています。
エラーの出力される際にどのエラー処理なのか、その出力される項目名が、前項で解説をしたバリデーションのルールの名称となります。
|
1 2 3 4 |
[url] => Array ( [not-url] => Enter a valid URL ) |
詳細については、CakePHP3のマニュアルを参照してください。
https://book.cakephp.org/3.0/ja/core-libraries/validation.html#id13
ちなみに、ほぼ同じ内容ですが、フォームから入力された情報を保存する前にバリデーションをする記事を書きました。こちらもあわせて参考にしてください。
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP4 のコマンドプログラムからコンポーネントを読み込む方法解説
CakePHP4でコマンドプログラムからコンポーネントを呼び出す方法を解説。コントローラーから呼び出すときと大差はないが、use句でコンポーネントを指定する事がポイント。
-
-
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。
-
-
CakePHP4、5のユーザ認証でID、PASS以外の削除フラグなども条件加える方法
CakePHP4系、5系ではAuthenticationを使用してログイン認証を行う。その認証でID、PASS以外の削除フラグなどの条件を加えたいときの対応方法について解説。
-
-
CakePHP 2.3でファイルのアップロード処理を作る
CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。
-
-
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でレコードを追加、更新(Insert、Update)する記述方法を解説。1件ずつ処理、全件をまとめて処理、条件に該当する複数件のレコードを処理方法をサンプルコードを用いて解説。
-
-
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でテーブルの数値項目に対してlike句を使用した部分一致検索を実行するとエラーが発生する。クリエービルダーの不具合だと思われ対処方法が分からない。
-
-
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。
-
-
Windows環境の XAMPPを利用して CakePHPの開発する際の注意点
WindowsベースにXAMPPで環境を構築しCakePHP4を利用したWebシステムを構築する際は、大文字と小文字の違いを意識する必要がある。LinuxベースのWebサーバに移動させたときに不具合で動作しないこともある。
-
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。