パスワードの入力を求めるフォームには、確認用パスワードの入力も付きものだったりします。その際に、2つの入力内容が一致しているかどうかをバリデーションで確認する実装を紹介したいと思います。
バリデーションの記述
パスワードに対して以下のバリデーションをセットします。
【Model/Table/UsersTable.php】
public function validationDefault(Validator $validator)
{
$validator
->notEmpty('username', 'ユーザ名は省略出来ません。');
$validator
->notEmpty('password', 'パスワードは省略出来ません。')
->allowEmpty('password','update')
->add('password',[ //←バリデーション対象カラム
'comWith' => [ //←任意のバリデーション名
'rule' => ['compareWith','password_check'], //←バリデーションのルール
'message' => '確認用のパスワードと一致しません' //←エラー時のメッセージ
]
]);
return $validator;
}
バリデーションのルールに「compareWith」というものがあります。
「’rule’ => [‘compareWIth’,’確認用パスワードのキー’]」
上記のようにルールを設定しておくことで、「password」と「password_check」を比較して一致しなければエラーを返すようになります。
設定自体はこれだけになります。
実際にどう使うかをこれから説明します。
入力フォームの準備
簡単な入力フォームを用意します。
【Template/Users/create.ctp】
<form method="post">
<fieldset>
<div>
<div>
<label>ユーザー名</label>
<div>
<input type="text" name="username">
<?php echo $this->Flash->render('username'); ?>
</div>
</div>
<div>
<label>パスワード</label>
<div>
<input type="text" name="password">
<?php echo $this->Flash->render('password'); ?>
</div>
</div>
<div>
<label>パスワード確認用</label>
<div>
<input type="text" name="password_check" >
</div>
</div>
<div>
<button type="submit">確認</button>
</div>
</div>
</fieldset>
</form>
ここで「name」の要素に「password」と「password_check」を指定しておきます。
受け取るコントローラーの処理
先ほどのフォームから送信されたデータを受け取る側のコントローラーの処理はこちらになります。
【Controller/UsersController.php】
public function create()
{
if ($this->request->is('post')) {
$savedata = $this->request->data;
$user = $this->Users->newEntity($savedata);
$errors = $user->errors();
if (empty($errors)) {
$this->redirect(['action' => 'confirm']);
} else {
foreach ($errors as $key => $error) {
foreach ($error as $error_messages) {
$this->Flash->error($error_messages, ['key' => $key]);
}
unset($key, $error_messages);
}
unset($error);
}
}
}
POSTで受け取ったデータをエンティティに変換しています。
さらに、「$user->errors()」でnewEntity()時にチェックされたバリデーションのエラーを取得することができます。
エラーがなければ確認画面へ、エラーがある場合は確認ん画面には遷移せずにエラー表示をします。
まとめ
使用するモデルの「validationDefault」で、チェック対象のカラムに対して「compareWith」のルールを追加するだけです。
飲食業界からIT業界に転身してきて現在2年目です。PHPの経験がメインとなります。これまで自分がPHPを扱ってきた上で、モヤモヤしてきたことをメインに記事にしていきますのでよろしくお願いいたします。