CakePHP3で値を入力直後にバリデーションする方法解説
2019/03/25
CakePHP3で入力された値を入力直後にバリデーションする処理
CakePHP3の入力チェックは、データベースに情報を保存する際にエラー処理を行っていますが、入力された値を何かしら加工をして、それから保存する場合など、あらかじめ入力チェックをしておきたい、と思う場面もあるでしょう。
そういう場合に、入力直後にバリデーション(入力チェック)を行う処理も用意されていますので、その処理について解説を行います。
CakePHP3で Bakeしたデフォルトの処理
CakePHP3で、リンクの情報を登録する「Links」というテーブルを作成し、Bakeして作成されたデフォルトの処理が下記になります。
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行目を追加することで、入力の値を受け取った直後にバリデーション処理を実施することができます。
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()」で取得する入力値のオブジェクトに対して、受け取った直後にバリデーション(入力チェック)を行う処理を追加しています。
[amazonjs asin=”4798048577″ locale=”JP” title=”PHPフレームワーク CakePHP 3入門”]
CakePHP3でのバリデーション処理の詳細解説
細かく説明しますと、6行目の「newEntity()」の処理で、リクエストデータを設定します。
$link = $this->Links->newEntity();
↓この中に「$this->request->data」を追加
$link_check = $this->Links->newEntity($this->request->data);
7行目の「$link_check->errors()」で、バリデーション処理で発生したエラーの情報を取得し、エラーがある場合は、エラー処理を行います。
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
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()」で取得できるエラーについてです。
取得できるエラーは以下のような形となっています。
エラーの出力される際にどのエラー処理なのか、その出力される項目名が、前項で解説をしたバリデーションのルールの名称となります。
[url] => Array
(
[not-url] => Enter a valid URL
)
詳細については、CakePHP3のマニュアルを参照してください。
https://book.cakephp.org/3.0/ja/core-libraries/validation.html#id13
ちなみに、ほぼ同じ内容ですが、フォームから入力された情報を保存する前にバリデーションをする記事を書きました。こちらもあわせて参考にしてください。
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法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」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3でデフォルトのソート条件を設定しつつ画面上でユーザがソート条件を選択したときもソート処理を実行させる方法を解説。ソート条件はページネーションの処理として実装。
-
-
CakePHP4系、CakePHP5系のexists()でカラムを指定して値の有無をチェックする方法解説
CakePHP4、5で指定したカラムに特定の値に該当のレコードの有無をチェックするにはexists()を使う。単純にカラムを指定する方法から複数条件をand、orで探すこともできる。
-
-
CakePHP3で環境変数を設定して本番環境と開発環境を分けて処理をする場合
CakePHP3で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定し、それを読み込み判別する。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
-
CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」
CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。
-
-
CakePHP4、CakePHP5系の認証処理でログインの有無の確認、ユーザ情報の取得の方法
CakePHP4系、5系のログイン認証の可否のチェック、および、ログインユーザの情報を取得する方法のまとめ。複数の方法があるが手続きが微妙に異なるためまとめてみた。
-
-
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。
-
-
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。