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::write
geändert (die Signatur ist dieselbe), und es wurde eine Methode filePutContent
angezeigt, die etwas Ähnliches wie write
frü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 getCurrentVersion
aussieht
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 if
oder case
Aussagen zu machen?
quelle
method_exists
(method_exists ( mixed $object , string $method_name )
) verwenden, die weniger restriktiv und zuverlässiger ist.Antworten:
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_exists
Funktion ( http://php.net/manual/en/function.method-exists.php ) verwenden, die weniger restriktiv und zuverlässiger ist.quelle