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::write
changé son fonctionnement (la signature est la même) et la méthode filePutContent
est apparue qui fait quelque chose de similaire à ce qui était write
utilisé 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 getCurrentVersion
ressemble à 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 if
ni case
déclarations?
method_exists
(method_exists ( mixed $object , string $method_name )
), qui est moins restrictive et plus fiable.