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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
CakePHP3のForm Helperの使い方のまとめ
CakePHP3になりフォームヘルパーの使い方も大きく変わりましたので、使い方をまとめました。基本的な使い方からプラスアルファの便利な使い方まで紹介。
-
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。
-
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
CakePHP 2.3で saveの便利な使い方・サンプルソース付き
CakePHPのレコードを保存、更新する際に使う Saveを詳細解説します。
-
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法
CakePHP3で現在処理しているコントローラー名、アクション名を取得する方法を解説。複数の方法があるが、getParam()メソッドを使う方法が汎用性があって便利かも。
-
Google Analytics APIを CakePHP3で動かしてレポートデータを取得する方法の解説
CakePHP3で Google Analytics APIからレポートデータを取得する処理の解説。PHPのサンプルソースをCakePHP3で動くように改造。加えて、ディメンションやメトリックスを条件に設定する方法なども。