CodeIgniter 3.* で入力されたメールアドレスが DB に存在するか確認する際のバリデーションルール名で少し迷ったのでメモ。
※ CI のバリデーションについては Form Validationを参考
やりたいこと
ユーザ登録時、入力されたメールアドレス(email)が DB に
- 存在する:バリデーションエラー
- 存在しない:非エラー
となるよう、「メールアドレスは存在するか」を意味するルール名を作る。
実装
存在すれば真、存在しなければ偽を返す以下のメソッドを作成した。
function _is_email_existed($email)
{
return $this->db->_is_email_existed($email);
}
DB->_is_email_existed() は、引数 email を条件に DB を検索し、その件数を返すメソッド。
(0件のときのみ FALSE になる)
これを用いてバリデーションを実行すると、以下の結果となる。
入力 | DB | 返り値 | 検証 | 期待 |
---|---|---|---|---|
a@b.com | a@b.com | TRUE | OK | 重複有り:NG |
b@c.com | a@b.com | FALSE | NG | 重複無し:OK |
つまり、「入力値は存在するか」という命題は、存在すれば真、存在しなければ偽を返すが、検証は真のときエラーとならないため、おかしなことになる。
かといって、この命題に対する返り値を否定すると、命題とそれに対する返り値が不自然。
どうするのがより自然で一般的なのか?
以下の2つの候補がある。
- ルール名を is_email_not_existed にして整合させる
- 返り値を否定する
と挙げたが、1 の場合はいちいち存在確認の検証ルールに "not" をつけることになるし、
他ルールの慣習に合わない気がする。しかも、長い。
結果
ルール名は is_email_existed のまま、返り値を否定することによって実現。
つまり、以下の通り。
function _is_email_existed($email)
{
return ! $this->db->_is_email_existed($email);
}
これで、重複があれば NG、なければ OK が返る。