商用で使用する拡張機能を作成する場合、複数のMagentoバージョン、おそらくCEとEEでも機能するようにすると便利です。
ただし、コアがバージョンごとに変更されるため、これが計画どおりに機能しない場合があります。
私の質問は、拡張機能に影響する小さなコア変更をどのように処理すればよいかについてです。リファクタリングを必要とする大きな変更について話しているのではありません。
これを明確にするための例を次に示します。
CE 1.8.1(およびEE 1.13.1)以降、このメソッドは動作方法をVarien_Io_File::write
変更し(シグネチャは同じです)、以前filePutContent
と同じように動作するメソッドが登場write
しました。
今私は何かハッキーなことをして、同じ結果を達成するためにどの方法を使用するかを知るためにMagentoのバージョンをチェックします
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
これはEEでも動作するようにしたいのですが、1.8.1はCEに固有であるため、さらに醜くなります。したがって、上記のコードは次のようになります
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
メソッドgetCurrentVersion
は次のようになります
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
上記のコードは少し簡略化されています(実際のコードでは、バージョンに適切な定数を使用しています)
しかし、この方法Mage::getEdition()
が導入されたとき、これはCE 1.7以降で機能します。CE 1.7より前のバージョンで動作させたい場合は、さらにおかしくなります。
ここで、バージョンCE 1.11とEE 1.16でこの変更が再度行われたとします。カオスは必ず発生します。
if
またはcase
ステートメントを使用せずにこれを行うよりクリーンな方法はありますか?
method_exists
(method_exists ( mixed $object , string $method_name )
)関数も使用します。