以前のバージョンから Zend Framework 1.7 またはそれ以降に更新する際は、 下記の移行上の注意点に注意すべきです。
Zend_File_Transfer
のバリデータが
Zend_Config
と組み合わせて使えないという指摘がありました。
名前つき配列を使っていなかったからです。
そこで、Zend_File_Transfer
用のすべてのフィルタとバリデータを作り直しました。
古い構文でも動作しますがこれは非推奨となり、
設定せずに実行すると PHP の notice が発生するようになります。
次のリストは、パラメータの使用法に関する変更点をまとめたものです。
古い形式の API:
Zend_Filter_File_Rename($oldfile, $newfile, $overwrite)
新しい形式の API:
Zend_Filter_File_Rename($options)
$options
には次の配列キーを使えます。 source ($oldfile
と同等)、 target ($newfile
と同等)、 overwrite ($overwrite
と同等)
例1030 rename フィルタの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addFilter('Rename', array('/path/to/oldfile', '/path/to/newfile', true)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addFilter('Rename', array('source' => '/path/to/oldfile', 'target' => '/path/to/newfile', 'overwrite' => true));
古い形式の API:
Zend_Validate_File_Count($min, $max)
新しい形式の API:
Zend_Validate_File_Count($options)
$options
には次の配列キーを使えます。 min ($min
と同等)、 max ($max
と同等)
例1031 count バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Count', array(2, 3)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Count', false, array('min' => 2, 'max' => 3));
古い形式の API:
Zend_Validate_File_Extension($extension, $case)
新しい形式の API:
Zend_Validate_File_Extension($options)
$options
には次の配列キーを使えます。 * ($extension
と同等、任意の他のキーを使用可能)、 case ($case
と同等)
例1032 extension バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Extension', array('jpg,gif,bmp', true)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Extension', false, array('extension1' => 'jpg,gif,bmp', 'case' => true));
古い形式の API:
Zend_Validate_File_FilesSize($min, $max, $bytestring)
新しい形式の API:
Zend_Validate_File_FilesSize($options)
$options
には次の配列キーを使えます。 min ($min
と同等)、 max ($max
と同等)、 bytestring ($bytestring
と同等)
さらに useByteString()
メソッドのシグネチャも変わりました。
このメソッドの使用法は、
そのバリデータが生成するメッセージでバイト文字列を使うことを想定しているかどうかを調べるだけになりました。
フラグの値を設定するには
setUseByteString()
メソッドを使用します。
例1033 filessize バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('FilesSize', array(100, 10000, true)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('FilesSize', false, array('min' => 100, 'max' => 10000, 'bytestring' => true)); // 1.6 の例 $upload->useByteString(true); // set flag // 1.7 の例 $upload->setUseByteSting(true); // set flag
古い形式の API:
Zend_Validate_File_Hash($hash, $algorithm)
新しい形式の API:
Zend_Validate_File_Hash($options)
$options
には次の配列キーを使えます。 * ($hash
と同等、任意の他のキーを使用可能)、 algorithm ($algorithm
と同等)、
例1034 hash バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Hash', array('12345', 'md5')); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Hash', false, array('hash1' => '12345', 'algorithm' => 'md5'));
古い形式の API:
Zend_Validate_File_ImageSize($minwidth, $minheight, $maxwidth, $maxheight)
新しい形式の API:
Zend_Validate_File_FilesSize($options)
$options
には次の配列キーを使えます。 minwidth ($minwidth
と同等)、 maxwidth ($maxwidth
と同等)、 minheight ($minheight
と同等)、 maxheight ($maxheight
と同等)
例1035 imagesize バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('ImageSize', array(10, 10, 100, 100)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('ImageSize', false, array('minwidth' => 10, 'minheight' => 10, 'maxwidth' => 100, 'maxheight' => 100));
古い形式の API:
Zend_Validate_File_Size($min, $max, $bytestring)
新しい形式の API:
Zend_Validate_File_Size($options)
$options
には次の配列キーを使えます。 min ($min
と同等)、 max ($max
と同等)、 bytestring ($bytestring
と同等)
例1036 size バリデータの 1.6 から 1.7 での変更点
// 1.6 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Size', array(100, 10000, true)); // 1.7 の例 $upload = new Zend_File_Transfer_Adapter_Http(); $upload->addValidator('Size', false, array('min' => 100, 'max' => 10000, 'bytestring' => true));
コーディング規約に従うと、 isLocale()
は boolean
値を返さなければなりませんでした。
以前のバージョンでは、成功したばあいに文字列を返していました。
リリース 1.7 では、互換性モードが追加されて文字列を返す古い挙動も使えます。
しかし、このばあいは新しい挙動に変更するようにというユーザ警告が発生します。
古い挙動の isLocale()
が行っていた再ルーティングはもはや不要で、
すべての I18n は自分自身で再ルーティングを行います。
あなたのスクリプトを新しい API 用に変更するには、次のようにメソッドを使用します。
例1037 isLocale() を 1.6 用から 1.7 用に変更する方法
// 1.6 の例 if ($locale = Zend_Locale::isLocale($locale)) { // ここで何かします } // 1.7 の例 // 互換性モードを変更して警告の発生を防ぐ必要があります // これは起動ファイルで行うことができます Zend_Locale::$compatibilityMode = false; if (Zend_Locale::isLocale($locale)) { }
2 番目のパラメータを使えば、 そのロケールが正しくて再ルーティングが発生しなかったかどうかがわかることに注意しましょう。
// 1.6 の例 if ($locale = Zend_Locale::isLocale($locale, false)) { // ここで何かします } // 1.7 の例 // 互換性モードを変更して警告の発生を防ぐ必要があります // これは起動ファイルで行うことができます Zend_Locale::$compatibilityMode = false; if (Zend_Locale::isLocale($locale, false)) { if (Zend_Locale::isLocale($locale, true)) { // ロケールはありません } // もとの文字列はロケールを持ちませんが再ルーティングできます }
getDefault()
メソッドの意味が変わりました。
フレームワークにロケールが統合され、それを setDefault()
で設定できるようになったからです。
このメソッドはもはやロケールチェインを返すことはなく、
フレームワークのロケールに設定されたものだけを返します。
あなたのスクリプトを新しい API 用に変更するには、次のようにメソッドを使用します。
例1038 getDefault() を 1.6 用から 1.7 用に変更する方法
// 1.6 の例 $locales = $locale->getDefault(Zend_Locale::BROWSER); // 1.7 の例 // 互換性モードを変更して警告の発生を防ぐ必要があります // これは起動ファイルで行うことができます Zend_Locale::$compatibilityMode = false; $locale = Zend_Locale::getOrder(Zend_Locale::BROWSER);
古い実装における getDefault()
の 2 番目のパラメータはもはや使えないことに注意しましょう。
返り値がそれと同じ値となります。
注記
デフォルトでは古い挙動も有効ですが、ユーザ警告が発生します。
新しい挙動にあわせてコードを変更し終えたら、
互換性モードを FALSE
に変更して警告が発生しないようにしなければなりません。
言語の自動検出を使用したり Zend_Translate
に手動で言語を設定したりする際に、
「追加に失敗」や「翻訳がない」などの理由で notice が発行されることがありました。
以前のリリースでは、場合によっては例外が発生することもありました。
その原因は、存在しない言語をユーザが指定した際に 何が問題なのかを知る簡単な方法がなかったことにあります。 そこで私たちは notice を発行させるようにしていたのです。 ログに記録が残るので、サポートしていない言語がリクエストされたことがわかるようになります。 そしてたとえ notice が発行されたとしても、コード自体は問題なく動作します。
しかし、xdebug のような独自のエラーハンドラ/例外ハンドラを使った場合など、 意図せぬものも含めてすべての notice を拾ってしまうこともあります。 そういった独自のハンドラは PHP の設定を上書きしてしまうことがあるからです。
これらの notice を発生させないようにするためには、新たなオプション
'disableNotices' を TRUE
に設定するだけです。デフォルトは FALSE
となっています。
例1039 notice を取得せずに言語の設定を行う
ここでは、'en' に対応しているところにユーザから 'fr' がリクエストされたものと家庭します。この翻訳は登録されていません。
$language = new Zend_Translate('gettext', '/path/to/translations', 'auto');
この場合、存在しない言語 'fr' が指定されたことに関する notice が発行されます。 オプションを追加すると、この notice は発生しなくなります。
$language = new Zend_Translate('gettext', '/path/to/translations', 'auto', array('disableNotices' => true));
注記
Zend_View
内の API 変更は、
リリース 1.7.5 またはそれ以降にアップグレードする際にだけ注意すべきです。
Zend Framework 開発陣は、1.7.5 より前のバージョンにおいて
Zend_View::render()
メソッドにローカルファイル読み込み
(Local File Inclusion: LFI) 脆弱性の問題があることに気づきました。
1.7.5 より前のバージョンでは、このメソッドはデフォルトで
親ディレクトリを指す記法 ("../" や "..\")
を含むビュースクリプトも指定できてしまいます。
フィルタリングをしていないユーザ入力が render()
メソッドに渡されると、 LFI 攻撃を受ける可能性が出てきます。
// $_GET['foobar'] = '../../../../etc/passwd' だったら…… echo $view->render($_GET['foobar']); // LFI
Zend_View
は、このようなビュースクリプトがリクエストされると
デフォルトで例外を発生させるようになりました。
多くの開発者から「ユーザの入力ではない
場面で、意図的にこれらの記法を使っていることもある」という指摘を受けたため、
特別なフラグを用意してデフォルトの保護機能を無効化できるようにしました。
無効化する方法は二通りあります。コンストラクタのオプションで
'lfiProtectionOn' キーを指定するか、あるいは
setLfiProtection()
メソッドをコールします。
// コンストラクタでの無効化 $view = new Zend_View(array('lfiProtectionOn' => false)); // メソッドコールによる無効化 $view = new Zend_View(); $view->setLfiProtection(false);