CakePHPの組み込みバリデーションルールを理解する(email編)

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)));

フレームワークを使っていると、ついつい与えられたものをそのまま使うだけになりがちですが、実際にどんな処理を行っているのか、折にふれ確認してみることも大事ですね。

参考情報
  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ