Erweiterung wird von mehreren Versionen unterstützt

8

Wenn Sie eine Erweiterung für den kommerziellen Gebrauch erstellen, wäre es schön, wenn sie auf mehreren Magento-Versionen funktioniert, möglicherweise auch auf CE und EE.
Aber manchmal funktioniert dies nicht wie geplant, da sich der Kern von Version zu Version ändert.
Meine Frage ist, wie ich mit den kleinen Kernänderungen umgehen soll, die sich auf meine Erweiterung auswirken. Ich spreche nicht von großen Änderungen, die ein Re-Factoring erfordern.
Hier ist ein Beispiel, um es klarer zu machen.
Ab CE 1.8.1 (und EE 1.13.1) hat die Methode ihre Funktionsweise Varien_Io_File::writegeändert (die Signatur ist dieselbe), und es wurde eine Methode filePutContentangezeigt, die etwas Ähnliches wie writefrüher tut.
Im Moment mache ich etwas Hackiges und überprüfe die Version von Magento, um zu wissen, mit welcher Methode ich das gleiche Ergebnis erzielen kann

/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
    $io->write($destinationFile, $contents, 0777);
} else {
    $io->filePutContent($destinationFile, $contents);
}

Nun, ich möchte, dass dies auch auf EE funktioniert. Es wird noch hässlicher, weil 1.8.1 spezifisch für CE ist. So wird der obige Code

/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
    $io->write($destinationFile, $contents, 0777);
} else {
    $io->filePutContent($destinationFile, $contents);
}

wo die Methode so getCurrentVersionaussieht

public function getCurrentVersion()
{
    if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
        return '1.13.1';
    }
    return '1.8.1';
}

Der obige Code ist etwas vereinfacht (ich verwende die richtigen Konstanten für Versionen in meinem realen Code ).

Dies funktioniert jedoch für CE 1.7 und höher, als die Methode Mage::getEdition()eingeführt wurde. Wenn ich möchte, dass es auf Version vor Ce 1.7 funktioniert, wird es noch verrückter.

Stellen Sie sich nun vor, dass sich dies in Version CE 1.11 und EE 1.16 erneut ändert. Chaos muss passieren.

Gibt es eine sauberere Möglichkeit, dies zu tun, ohne dies zu tun ifoder caseAussagen zu machen?

Marius
quelle
Ich bin nicht mit diesem Problem konfrontiert worden, aber vielleicht kann meine Meinung hilfreich sein. Aus Gründen der Lesbarkeit würde ich wahrscheinlich alle diese "problematischen" Methoden wie einen Helfer in derselben Datei zusammenfassen. Für das Beispiel, das Sie oben angegeben haben, würde ich auch die Funktion method_exists( method_exists ( mixed $object , string $method_name )) verwenden, die weniger restriktiv und zuverlässiger ist.
Mayers
@Mayers. Sie sollten dies als Antwort schreiben. Sieht nach einem gültigen Ansatz aus. Kein perfekter, aber ein gültiger :)
Marius

Antworten:

3

Ich bin nicht mit diesem Problem konfrontiert worden, aber vielleicht kann meine Meinung hilfreich sein. Aus Gründen der Lesbarkeit würde ich wahrscheinlich alle diese "problematischen" Methoden wie einen Helfer in derselben Datei zusammenfassen. Für das oben angegebene Beispiel würde ich auch die method_existsFunktion ( http://php.net/manual/en/function.method-exists.php ) verwenden, die weniger restriktiv und zuverlässiger ist.

Mayers
quelle