Extension prise en charge sur plusieurs versions

8

Lors de la création d'une extension à usage commercial, ce serait bien si cela fonctionne sur plusieurs versions de Magento, peut-être aussi CE et EE.
Mais parfois, cela ne fonctionne pas comme prévu car le noyau change d'une version à l'autre.
Ma question concerne, comment dois-je gérer les petits changements de base qui affectent mon extension. Je ne parle pas d'énormes changements qui nécessitent une refactorisation.
Voici un exemple pour le rendre plus clair.
À partir de CE 1.8.1 (et EE 1.13.1), la méthode a Varien_Io_File::writechangé son fonctionnement (la signature est la même) et la méthode filePutContentest apparue qui fait quelque chose de similaire à ce qui était writeutilisé auparavant.
En ce moment, je fais quelque chose de hacky et vérifie la version de Magento afin de savoir quelle méthode utiliser pour obtenir le même résultat

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

Maintenant, je veux que cela fonctionne aussi sur EE. Cela devient encore plus laid car 1.8.1 est spécifique à CE. Ainsi, le code ci-dessus devient

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

où la méthode getCurrentVersionressemble à ceci

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

Le code ci-dessus est un peu simplifié (j'utilise des constantes appropriées pour les versions de mon vrai code )

Mais cela fonctionne pour CE 1.7 et supérieur lorsque la méthode a Mage::getEdition()été introduite. Si je veux qu'il fonctionne sur la version antérieure à ce 1.7, cela devient encore plus fou.

Imaginez maintenant que cela change à nouveau dans les versions CE 1.11 et EE 1.16. Le chaos est inévitable.

Existe-t-il une façon plus propre de le faire sans faire ifni casedéclarations?

Marius
la source
Je n'ai pas été confronté à ce problème, mais peut-être que mon avis peut être utile. Pour des raisons de lisibilité, je regrouperais probablement toutes ces méthodes "problématiques" dans le même fichier, comme un assistant. De plus, pour l'exemple que vous avez donné ci-dessus, j'utiliserais également la fonction method_exists( method_exists ( mixed $object , string $method_name )), qui est moins restrictive et plus fiable.
Mayers
@Mayers. Vous devez écrire ceci comme réponse. Ressemble à une approche valide. Pas parfait, mais valide en effet :)
Marius

Réponses:

3

Je n'ai pas été confronté à ce problème, mais peut-être que mon avis peut être utile. Pour des raisons de lisibilité, je regrouperais probablement toutes ces méthodes "problématiques" dans le même fichier, comme un assistant. De plus, pour l'exemple que vous avez donné ci-dessus, j'utiliserais également la method_existsfonction ( http://php.net/manual/en/function.method-exists.php ), qui est moins restrictive et plus fiable.

Mayers
la source