複数のバージョンでサポートされる拡張機能


8

商用で使用する拡張機能を作成する場合、複数の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_existsmethod_exists ( mixed $object , string $method_name ))関数も使用します。
Mayers

@メイヤーズ。これを答えとして書いてください。有効なアプローチのように見えます。完璧なものではありませんが、確かに有効なものです:)
マリウス

回答:


3

私はその問題に直面していませんが、私の意見は役に立つかもしれません。読みやすくするために、ヘルパーのように、これらすべての「問題のある」メソッドを同じファイルにグループ化するでしょう。また、上記の例では、制限が少なく信頼性の高いmethod_exists関数(http://php.net/manual/en/function.method-exists.php)も使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.