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のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。
-
-
CakePHP 2.3 テーブルの項目を演算した結果を条件として抽出する方法
アソシエーション(連携)している先のテーブルの項目で演算をする場合の考え方と注意点をサンプルソースを用いて説明しています。分かってしまえば簡単です。
-
-
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
CakePHP4でコマンドを実行する際に引数(パラメータ)をコマンド内で受け取る処理について解説。複数個の引数にも対応する記述方法も解説。
-
-
CakePHP 2.3 Search Pluginで検索処理 その5入力項目に複数項目入力した場合の AND検索、OR検索
CakePHPの検索プラグイン Search Pluginの検索処理の中で複数項目を入力した場合の AND検索、OR検索についての解説です。
-
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
-
CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除
CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。
-
-
CakePHP3のfriendsofcake/searchでブックマークチュートリアルのタグ検索を実装
CakePHP3のCookbookにあるブックマークチュートリアル。ここで紹介されているタグで検索する処理を検索プラグイン「friendsofcake/search」で実現する方法を解説しました。
-
-
CakePHP3でファイルのアップロード処理を自作・解説付き・その1
CakePHP3でファイルをアップロードする処理を、php.netにある「エラーを起こさない」と説明がある処理を参考に作成。サンプルソースとその解説付きで、コピペでも動くし、カスタマイズも簡単!
-
-
CakePHP3ログファイルへの出力・$this->log()、独自ログへの出力方法の解説
コントロール、モデルの変数の中身を見るときはログに出力する方法が有効です。$this->log()を利用すると変数だけじゃなく、連想配列、オブジェクトも簡単にログ出力ができます。
-
-
CakePHP3で他のテーブルのマスタテーブルからセレクトボックス(プルダウンリスト)を作る
他のテーブルのマスタのレコードからプルダウンリストを作成し、選択できるようにするサンプルプログラムと解説。ORMの設定によりデータベースの値を取得し、配列を作成し optionsに与える。