忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/09/24 06:57 |
ZF-05:Zend_Validate

http://framework.zend.com/manual/ja/zend.validate.html
いわゆるひとつのバリデータです。
入力形式が整数か、メールアドレスの形式として正しいか、IPアドレスの形式として正しいか、クレカの形式の形式として正しいか、といったチェックを行うことができます。

本来の使い方としてはZend_Validate_Digits、Zend_Validate_EmailAddress等個別のバリデータをインクルードして、といった形なのですが、そんなの面倒でやってられないのでZend_Validateから全て静的に呼び出せるようになっています。
こういう実装は伝説のFactoryMethodパターンなんじゃないかと思うのですがよくわかりません。

それはまあ便利なのですが、この場合は欠点としてバリデータチェインが使用できません。

逆にバリデータチェインを行う場合は、各バリデータを手動でインクルードしないとエラーになってしまいます。

zend_validate.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
    
    //チェックする文字列
        $string='abc012';
        
    //Zend_Validate
        require_once('Zend/Validate.php');
    
    //静的にバリデート
        //必要なファイルは自動的に呼び出してくれる
        Zend_Validate::is($string, 'StringLength',array(6,12)); //trueになる
        Zend_Validate::is($string, 'Alpha');                    //falseになる
    
    //メソッドチェーンでバリデート
        //こちらの場合必要なファイルを全部インクルードしないとエラーになる
             require_once('Zend/Validate/StringLength.php');
           require_once('Zend/Validate/Alpha.php');
        //バリデートチェイン
             $validator=new Zend_Validate();
           $validator
               ->addValidator(new Zend_Validate_StringLength(6, 12))
               ->addValidator(new Zend_Validate_Alpha());
           $ret=$validator->isValid($string);
        
    //失敗した場合エラーメッセージを取得できる
        if(!$ret){
            $error_message=$validator->getMessages();
        }


このように、静的バリデートは使用は簡単ですが'6~12文字かつアルファベット'といった表現に弱く、逆にインスタンスを生成する場合は毎回個別バリデータをインクルードする必要があって面倒です。
毎回インクルードしまくるか、毎回静的に呼び出しまくるかの二択になってしまいます。
もうちょっとどうにかならなかったんでしょうか。


バリデータには通常使われる文字数やメールアドレスといったもの以外にも、16進文字やIBANコードなど珍しいものまでありますが、英語圏出身にふさわしく日本語関連のものはありません。
全角のみ、といったバリデータは自分で実装する必要があります。

また不注意にZend_Validate::is('あ', 'StringLength',array(3,3))とかやってしまうとtrueになってしまったりすることがあるので注意が必要です。
Zend_Validate_StringLengthの文字数比較はiconv_strlen()という見慣れぬ関数で行われており、これのデフォルトがISO-8859-1なので、'あ'がUTF-8だったら3文字と判断されてしまいます。
Zend_Validate_StringLengthを使用する場合は必ず何処かに
iconv_set_encoding('internal_encoding','UTF-8');
と書いておきましょう。


どうでもいいけど住所や電話番号欄に「全角のみ」ってバリデータは百害あって一利なし。

 

PR


2009/10/23 22:26 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<ミリデレの 正体見たり 枯れ木山 | HOME | ネットワークスペシャリスト模範解答発表>>
忍者ブログ[PR]