CakePHP 2.1 系のバリデーションの文字数チェック maxLength はマルチバイト文字にも対応している

昔の CakePHP のバリデーションには文字数チェックのバリデーションがありますが、これが日本語には対応していなかったと思いますが、現在ではしっかり対応されているようです。このコードは /lib/Cake/Utility/Validation.php にあります。ただ、mb_strlen の第2引数に私は文字コードを設定しないと不安なので、これを見る限りちょっと不安ではあります。

1
2
3
4
5
6
7
8
9
10
/**
 * Checks whether the length of a string is smaller or equal to a maximal length..
 *
 * @param string $check The string to test
 * @param integer $max The maximal string length
 * @return boolean Success
 */
	public static function maxLength($check, $max) {
		return mb_strlen($check) <= $max;
	}

でも実際に確かめた所文字数が多くなってもきちんとチェックされました。もし文字数チェックが今後上手く行かない場合は、やはりオリジナルできちんと文字コード設定してチェックしても良さそうです。

1
2
3
4
5
6
7
8
9
10
11
12
$validate = Array(
    'name' => Array(
        'notEmpty' => Array(
            'rule' => 'notEmpty',
            'message' => '名前が入力されていません。'
        ),
        'maxLength' => Array(
            'rule' => Array('maxLength', 32),
            'message' => '名前は32文字以内で入力してください。'
        ),
    ),
);

もし古いバージョンの CakePHP の場合は以下のようなオリジナルのバリデーションを作成して使うと良いかもしれません。動作チェックはしていないのでご利用頂く場合は動作検証をしてください。

1
2
3
4
5
6
7
8
9
10
public function mb_max_length($wordvalue, $max_length)
{
    $value = array_shift($wordvalue);
    $length = mb_strlen($value, 'UTF-8');
    if($length <= $max_length) {
        return true;
    } else {
        return false;
    }
}

追記: コメント欄にて1.3の時点で既に対応しているとの情報を頂きました。対応した正確なバージョンについて教えて頂きありがとうございました。

コメント

  1. stayさんのコメント

    いつも勉強させていただいてます!どうでもいいことですが、1.3で既に対応していますね。これ・・・ 本当どうでもいいことですが・・・

    • webleさんのコメント

      ありがとうございます。CakePHP 1.3 で対応とのことですね。大変参考になります。記事に追記させて頂きますね^^。