バリデーションをマスターする (3/6)
作成:2015-10-17 15:27
更新:2015-10-17 15:27
更新:2015-10-17 15:27
■バリデーションを機能させる
では、このバリデーション機能はどのように使えばいいのでしょうか。実は、これは非常に簡単です。というより、「使う」と意識する必要はまったくないのです。
サンプルとして、Personを追加するaddメソッドのコードを下に掲載しておきましょう。といっても、バリデーションらしき処理はまるでありません。
ポイントとしては、まずnewEntityでエンティティを作成し、それを$this->set('person', $person);で'person'という名前で保管してある、という点です。これは、テンプレート側でフォームを表示する際に利用するためです。
それ以外は、特に処理は必要ありません。CakePHP3では、saveでエンティティの保存を行う際、自動的にバリデーションチェックを行い、エラーが有った場合にはエンティティをデータベースに保管せずリダイレクトして再入力させるようになっているのです。
そして、テンプレート側では、必ず「フォームヘルパーを使ってフォームを作成する」という点がポイントになるでしょう。また、その際、 <?= $this->Form->create($person) ?>というように、コントローラー側から渡されたエンティティをcreateメソッドの引数に指定してやります。こうすることで、コントローラー側で入力エラーが発生した際には、そのエラー情報を保持したエンティティがcreateに渡され、自動的にエラーメッセージなどの情報が生成されるようになるのです。
「必ず保存するエンティティをテンプレート側に渡し、これを引数にしてフォームヘルパーでcreateする」という、このポイントさえ抑えれば、後はCakePHP3が自動的にバリデーション処理を行ってくれます。
サンプルとして、Personを追加するaddメソッドのコードを下に掲載しておきましょう。といっても、バリデーションらしき処理はまるでありません。
ポイントとしては、まずnewEntityでエンティティを作成し、それを$this->set('person', $person);で'person'という名前で保管してある、という点です。これは、テンプレート側でフォームを表示する際に利用するためです。
それ以外は、特に処理は必要ありません。CakePHP3では、saveでエンティティの保存を行う際、自動的にバリデーションチェックを行い、エラーが有った場合にはエンティティをデータベースに保管せずリダイレクトして再入力させるようになっているのです。
そして、テンプレート側では、必ず「フォームヘルパーを使ってフォームを作成する」という点がポイントになるでしょう。また、その際、 <?= $this->Form->create($person) ?>というように、コントローラー側から渡されたエンティティをcreateメソッドの引数に指定してやります。こうすることで、コントローラー側で入力エラーが発生した際には、そのエラー情報を保持したエンティティがcreateに渡され、自動的にエラーメッセージなどの情報が生成されるようになるのです。
「必ず保存するエンティティをテンプレート側に渡し、これを引数にしてフォームヘルパーでcreateする」という、このポイントさえ抑えれば、後はCakePHP3が自動的にバリデーション処理を行ってくれます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※コントローラー側のアクションメソッド
public function add()
{
$person = $this->Persons->newEntity();
$this->set('person', $person);
if ($this->request->is('post')) {
$person = $this->Persons->patchEntity($person, $this->request->data);
if ($this->Persons->save($person)) {
return $this->redirect(['action' => 'index']);
}
}
}
※テンプレート
<div>
<h3>Add Person</h3>
<?= $this->Form->create($person) ?>
<fieldset>
<?php
echo $this->Form->input('name');
echo $this->Form->input('age');
echo $this->Form->input('mail');
?>
</fieldset>
<?= $this->Form->button('Submit') ?>
<?= $this->Form->end() ?>
</div>
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る