CakePHP

CakePHP バリデーションの日本語問題

CakePHPにはバリデーションの機能があります。
入力データを任意の方法で正しい入力かどうかをチェックしてくれる機能。。。
大変便利機能で当たり前のように使っていると思いますが、やはり日本語周りがorz

まぁしかたの無いことなのですが、内部のライブラリの状態を見る限りでは
悲しいこと2バイト文字に関しては基本処理されていません。

例えば「minLength」というバリデーション方法。
入力文字数の最小数をチェックしてくれるバリデーションですが、
CakePHPの本体のままで利用して例として、最小文字数を2文字以上で
入力させたい場合で入力文字が「あ」と入力されたとします。

普通に考えればバリデーションに引っかかり、入力エラー処理をされますが、
もちろんあっさり通り抜けてしまいます(笑
まぁ内部を見ると簡単。。。2バイト文字は無視です(笑
※厳密には無視では無く、文字数の数え方が違います。

そこでCakePHPの本体を変更せずに、2バイト文字に対応させた
バリデーション方法はないか。。。もちろんバリデーション名も変更せずに。。。

その結果、「app_model.php」に以下の方法で対応できます。

function minLength($check, $min) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length >= $min);
}

既存のバリデーションにオーバロードをさせてしまう方法です。
こうすることで2バイト文字でも正しく文字数を判別することができるようになります。
その他のバリデーションも同じように変更することで2バイト文字のバリデーション対応にすることができます。
といってもあと2つなのでコピペができるようにまとめておきます。

function minLength($check, $min) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length >= $min);
}
function maxLength($check, $max) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length <= $max);
}
function between($check, $min, $max) {
	$check=(is_array($check))?current($check):$check;
	$length = mb_strlen($check,Configure::read('App.encoding'));
	return ($length >= $min && $length <= $max);
}

2バイト文字の処理がある場合は注意しておくと無難です(笑

コメント

  1. CakePHP 1.2.5 でハマったところ

    PHPで小規模なWebアプリを作ることになった。
    「彼氏が素のPHPでコード書いてた。別れたい…」ともいうし、CakePHPを使ってみることにした(おぃ