Zend Framework - Zend_Validate編

HOME | TOP

■ 概要


送られてくるデータは、期待した形式で入力されてくるとは限りません。
期待した形式と違えば、処理を続行せずにエラー画面を表示する必要があります。

もしそのまま処理を続行してしまえば、場合によってはその後の処理で保存データが読み取れなくなりアプリケーションの挙動がおかしくなる原因にもなります。

その他にも意図的に悪意のあるリクエストデータを送ってアプリケーションの弱点を突いてこられることも考えられます。

なので送られてきたデータはすべて期待する形式で無害なものなのかをきっちりチェックすることが必要です。このチェック作業を検証(Validation: バリデーション)と言います。


■ 標準バリデータを使ってみる


標準で用意されているバリデータがいくつかあるので使ってみます。



テストデータとして、わざと先頭ドットのやくざなメールアドレスを指定して、エラー内容を見てみます。

エラー内容
emailAddressDotAtom: '.foo' can not be matched against dot-atom format
emailAddressQuotedString: '.foo' can not be matched against quoted-string format
emailAddressInvalidLocalPart: '.foo' is no valid local part for email address '.foo@example.com'


こんなにしゃかりきに出さなくても ってぐらいずらりと表示されました。

これをエラーとしてそのまま表示してもなんだかなので、チェックだけをしてメッセージは自前で簡潔なものにすれば十分だと思います。

そのために、もっと簡潔な記述法として静的メソッドis()を使うことができます。

is()の使い方はこんな感じです。



これだとZend_Validateクラス1つ呼べばいろんなタイプの検証ができるので楽だと思います。

上記以外の標準のバリデーションは以下のとおり

require_once 'Zend/Validate.php';
if (!Zend_Validate::is($value,    'Alnum')) echo '英数字ではありません。';
if (!Zend_Validate::is($value,    'Alpha')) echo '英字ではありません。';
if (!Zend_Validate::is($value,   'Digits')) echo '数字ではありません。';
if (!Zend_Validate::is($value,     'Date')) echo 'YYYY-MM-DD形式日付ではありません。';
if (!Zend_Validate::is($value,    'Float')) echo '浮動小数点値ではありません。';
if (!Zend_Validate::is($value, 'Hostname')) echo 'ホストネームではありません。';
if (!Zend_Validate::is($value,      'Int')) echo '整数値ではありません。';
if (!Zend_Validate::is($value,       'Ip')) echo 'IPアドレスではありません。';
if (!Zend_Validate::is($value, 'NotEmpty')) echo '空ではありません。';
if (!Zend_Validate::is($value,     'GreaterThan', array(10))) echo '10より大きくありません。';
if (!Zend_Validate::is($value,        'LessThan', array(10))) echo '10より小さくありません。';
if (!Zend_Validate::is($value,    'Regex', array('/^foo$/'))) echo 'パターンにマッチしません。';
if (!Zend_Validate::is($value, 'StringLength', array(4, 10))) echo '4〜10文字の範囲内ではありません。';

■ バリデータの自作


バリデータを自作するには、Zend_Validate_Abstractを継承したサブクラスを作ります。

[Hoge_Check.php]

"hoge"以外は認めないバリデータです。

自作バリデータも標準バリデータと同様、クラスを呼び出してisValid()で検証する方法と、静的メソッドis()を使って検証する方法が使えます。



is()を使った場合は、エラーメッセージを使えないので直書きするしかないです。

次はいくつかの検証を複合して特化させたバリデータの自作に挑戦してみます。

SJISコード(+アスキーコード)の文字列長を検証するバリデータです。

[SjisLength.php]

PHP組み込みのmb_detect_encoding()関数がポンコツなのでpreg_match()で検証しています。

標準では用意されてないけど自分がよく使う検証を自作しておけば便利になります。


では、もう一つ作ってみましょう。
日本語(SJISコード)が指定文字数連続で入ってないとエラー判定するバリデータを作ってみます。

[SjisIncLength.php]

だいたいこのような感じで作っていくことができます。


2010(C)Mingw