FuelPHPのUploadクラスのUploaded files arrayの仕様変更(たぶん1.6から)とバグ情報 post

FuelPHPのUploadクラスの不具合に遭遇したので記録しておきます。

Uploadクラスの仕様変更

あまり、はまる人は少ないかも知れませんが、FuelPHPのUploadクラスのアップロードファイルの情報が格納される配列の仕様が、UploadクラスがFuelPHP 2.0のパッケージを使うように変更された1.6から変わっていたようです。

ただし、Upload::get_files()、Upload::get_errors()では、以下のように変換されて配列が返るため、互換性は維持されているようです。

    foreach ($files as $file)
    {
        $data = array();
        foreach ($file as $item => $value)
        {
            $item == 'element' and $item = 'field';
            $item == 'tmp_name' and $item = 'file';
            $item == 'filename' and $item = 'saved_as';
            $item == 'path' and $item = 'saved_to';
            $data[$item] = $value;
        }
        $data['field'] = str_replace('.', ':', $data['field']);
        $data['error'] = ! $file->isValid();
        $data['errors'] = array();
        $result[] = $data;
    }

つまり、Upload::register()などで、この配列を直接操作する場合は、仕様変更に引っかかります。以下のようにキーが変更されています。

field    → element
file     → tmp_name
filename → basename
saved_as → filename
saved_to → path

また、errorの値はboolからPHPのUpload error codeに変わっています。

Uploadクラスのバグ情報

FuelPHP 1.6.1のZipファイルでは、ComposerでインストールするUploadパッケージの名前空間が、1.6.1リリース後にFuelPHPからFuelに変更されたことが反映されておらず、以下のエラーが発生します。

Fatal error: Class 'FuelPHP\Upload\Upload' not found in .../fuel/core/classes/upload.php on line 90

これは、oil installコマンドでインストールされるGitHubの1.6/masterでは修正済みです。

もう1つ、Upload::register()で'validate'が使えないバグがありました。

InvalidArgumentException [ Error ]: after_validate is not a valid event
.../fuel/vendor/fuelphp/upload/src/FuelPHP/Upload/Upload.php @ line 320

これは、1.7/developで修正されています。

ただし、その他のバグ修正もされているので、Uploadクラスは1.7/developの最新のものを使うのがよいように思います。

Date: 2013/10/11

Tags: fuelphp, upload