Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

Zend_File_Transferのバリデータの仕様について

Zend Framework関連のネタです。
ZF-Exでファイルアップロードコンポーネント調整していたら発見した仕様。


Zend_File_Transferにて、一度の処理で複数のファイルをアップロードし、
かつバリデータを個別に設定するという運用を想定しています。


Zend_File_Transferのバリデーション設定についての公式マニュアルは下記のものです。

Zend Framework: Documentation: Zend_File_Transfer 用のバリデータ – Zend Framework Manual



Zend FrameworkでZend_File_Transferの
バリデータの設定を行う時は次のように記述します。

$upload = new Zend_File_Transfer();

// apadperの第4引数が対象となるファイル。
// デフォルトはnullで、nullならば全ファイル対象となる。
$upload->addValidator('Size', false, 20000, 'file_1');


バリデータの設定については
全ファイルを対象にしたものと、特定のファイルのみを対象にしたもので設定が可能です。
ここまでは問題ありません。

で、複数のファイルに対してバリデーションをかけるとどうなるか。

// アップロードされるファイルはfile_1とfile_2があるものとする。
$upload = new Zend_File_Transfer();
$upload->addValidator('Size', false, 20000);
$upload->addValidator('Extension', false, 'txt');

if(!$upload->isValid()){
    var_dump($upload->getErrors());
}


isValidを実行すれば全ファイルが対象となります。
file_1でサイズのエラー、file_2で拡張子のエラーがあった場合、
出力結果は次のようになります。

array(2) {
  [0]=>
  string(14) "fileSizeTooBig"
  [1]=>
  string(18) "fileExtensionFalse"
}

file_1とfile_2の結果が一つの配列にまとまってしまい、
どちらがどっちのエラーか分からなくなっています。
この他、両方ともサイズエラーだった時は「fileSizeTooBig」1つであったり、
複数ファイルに対して一斉にバリデーションを実行させると
どのファイルのエラーであるか出所が分からなくなるようになっています。


isValidの引数でも対象となるファイルを指定可能で、
個別にバリデーションを実行すればエラーも分かれて取得可能です。

$upload = new Zend_File_Transfer();
$upload->addValidator('Size', false, 20000);
$upload->addValidator('Extension', false, 'txt');

// file_1とfile_2それぞれのバリデーションを個別に実行する
if(!$upload->isValid('file_1')){
    var_dump($upload->getErrors());
}
if(!$upload->isValid('file_2')){
    var_dump($upload->getErrors());
}


なんか、失礼ながら絶妙に対応のし甲斐のある、
かゆい所に手が届かない不親切設計って感じがする。
対応方法はイメージがわいているので、ZF-Exでは次のバージョンにて対応します。
今週末までに仕上げる予定。

TrackBack URL :

Leave a comment  

name

email

website

Submit comment