CakePHPの組み込みバリデーションルールを理解する(email編)
CakePHPを使ったアプリケーションを開発する中で、メール送信用データのモデルを作成していたときのこと。
CakePHP1.2で追加された強力なValidation機能を使って、データの入力チェックを作成していました。
メールアドレスを格納するフィールドに対しては、もちろんValidation::emailを利用。
デフォルトのルールで大丈夫でしょう、と深く考えずマニュアルのサンプルのように単に「 var $validate = array('email' => array('rule' => 'email'));
」としたところ、実際のデータがたくさんエラー判定されてしまいました。それらはすべて携帯メールアドレス。
理由がわからなかったので、ここでようやく Validation::email 本体を覗いてみることに。
ソースコードの場所は (インストールdir)/cake/libs/validation.php になります。
function email($check, $deep = false, $regex = null) {
.....
if (is_null($_this->regex)) {
$_this->regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . $_this->__pattern['hostname'] . '$/i';
}
$return = $_this->_check();
....
}
引数 $regex を指定しない場合の、バリデーションルールは 上記のソースコードより次のようなパターンであることがわかります。
/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9][-a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,4}|museum|travel)
このパターンで許されるのは、RFCの仕様に沿ったメールアドレスのみです。
本当はそれのみで十分なのですが、携帯メールアドレスに対応するには、別のパターンに変更が必要になってきます。
というのも、携帯メールアドレスのローカルパート(@以前の部分)の仕様が”「半角英数字」「_」(アンダーバー)「.」(ピリオド)「-」(ハイフン)、3文字以上30字 以内”などとなっていて、上記のパターンで規制している「.」の連続などがOKになっているのです。(ちなみにdocomo、auのみ。softbankでは不可となっています。)
このdocomo、au携帯メールアドレスのみに対応させる場合のバリデーションルールは 次のようになります。
このパターンをパターンを第二引数に渡せばOKです。
define('MOBILE_MAIL_ADDRESS', '/^[a-z0-9\._-]{3,30}@(?:[a-z0-9][-a-z0-9]*\.)*(?:[a-z0-9][-a-z0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,4}|museum|travel)$/i');
....
var $validate = array('email' => array('rule' => array('email', false, MOBILE_MAIL_ADDRESS)));
フレームワークを使っていると、ついつい与えられたものをそのまま使うだけになりがちですが、実際にどんな処理を行っているのか、折にふれ確認してみることも大事ですね。