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

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の最新のものを使うのがよいように思います。

Tags: fuelphp, upload

今からFuelPHPを使う人が知るべき、FuelPHP 2.0に関する4つのこと

1. FuelPHP 2.0はまだ開発中です

FuelPHP 2.0の開発はかなり進んできていますが、リリースまでにはまだ多くの作業が残っており、年内(2013年)にはリリースされないでしょう(2013-10-30 追記:その後、2.0の最初のリリース目標は2014年の春と発表されました)。

2.0は2012年から開発が進められており、2012年7月に「First FuelPHP 2.0 alpha/beta releases」として、いくつかのコンポーネントがリリースされていますが、その後、ロードマップや開発方針が変更されており、状況やコードはその頃とは微妙に変わっています。

ただし、FuelPHP 1.xの問題を解消するための大きな開発方針は変わっていません。FuelPHP 2.0のコンポーネントは、以下で公開されています。

2.0についてのまとまった最新の情報は、以下の本家ブログ記事です。

開発中のため、現在の情報はすべて変更される可能性がありますが、大きな仕様はほぼ確定していると思います。かなり以前から大枠は変わっていません。

また、FuelPHPはもっともコミュニティ主導なフレームワークの1つであり、フィードバックをいつも歓迎しています。2.0についても同様であり、他に欲しい機能や更なる改良の提案などあれば、フィードバックするとよいでしょう。

2. PHP 5.4以上を必要とします

トレイトを使うため、5.4以上が必要とされます。

3. FuelPHP 1.xとの互換性は最大限確保されます

FuelPHP 2.0はメジャーバージョンアップですが、既存アプリをできるだけ簡単に移行できるように、最大限の努力がなされます。

一部の仕様変更により既存アプリのコードの変更は必要になりますが、検索&置換でかなり対応できるレベルでしょう。

ただし、マイグレーションや、Coreクラスを拡張している場合は多くの部分で互換性はなくなるでしょう。

また、プロパティに直接アクセスするようなコードは動作しなくなる可能性があり、その場合、ゲッターとセッターを使う必要があるでしょう。

4. コードが書き直され、内部も大きく変わります

Query Builderは書き直され、MySQL以外のサポートが向上します。ORMも改良されます。

新しい概念「Application」が導入されます。1つのFuelPHPは複数のApplication(とそのフロントローダ)を持つことができます。1つのApplicationは「Module」を複数持つことができます。Moduleは、

  • モジュールフォルダ名とは無関係な名前空間を持ちます
  • モジュールフォルダ名とは無関係なベースURIセグメントプリフィックスを持ちます
  • どこにでもインストールできます
  • ルーティング可能にも不能にも定義できます
  • モジュールの初期化のためのbootsrapを持ちます

用語も変わります。ViewModelはより適切と思われる「Presenter」に名称が変更されます。

FuelPHP 1.xでのPackageはなくなり、それらはComposerでのパッケージを使うことになります。

Tags: fuelphp, fuelphp2