Al crear una extensión para uso comercial, sería bueno si funciona en múltiples versiones de Magento, tal vez CE y EE también.
Pero a veces esto no funciona según lo planeado porque el núcleo cambia de una versión a otra.
Mi pregunta es acerca de cómo debo manejar los pequeños cambios centrales que afectan mi extensión. No estoy hablando de grandes cambios que requieren una refactorización.
Aquí hay un ejemplo para hacerlo más claro.
Al iniciar CE 1.8.1 (y EE 1.13.1), el método Varien_Io_File::write
cambió la forma en que funciona (la firma es la misma) y filePutContent
apareció el método que hace algo similar a lo que write
solía hacer anteriormente.
Ahora mismo hago algo hacky y compruebo la versión de Magento para saber qué método usar para lograr el mismo resultado.
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), '1.8.1', '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
Ahora, quiero que esto funcione en EE también. Se pone aún más feo porque 1.8.1 es específico de CE. Entonces el código anterior se convierte
/** @var Varien_Io_File $io */
if (version_compare(Mage::getVersion(), $this->getCurrentVersion(), '<')) {
$io->write($destinationFile, $contents, 0777);
} else {
$io->filePutContent($destinationFile, $contents);
}
donde el método se getCurrentVersion
ve así
public function getCurrentVersion()
{
if (Mage::getEdition() == Mage::EDITION_ENTERPRISE) {
return '1.13.1';
}
return '1.8.1';
}
El código anterior está un poco simplificado (uso constantes adecuadas para las versiones en mi código real )
Pero esto funciona para CE 1.7 y superior cuando Mage::getEdition()
se introdujo el método . Si quiero que funcione en la versión anterior a ce 1.7, se vuelve aún más loco.
Ahora imagine que esto cambia nuevamente en la versión CE 1.11 y EE 1.16. El caos está obligado a suceder.
¿Hay una manera más limpia de hacer esto sin hacer if
o case
declaraciones?
fuente
method_exists
(method_exists ( mixed $object , string $method_name )
), que es menos restrictiva y más confiable.Respuestas:
No me he enfrentado a ese problema, pero tal vez mi opinión pueda ser útil. Para fines de legibilidad, probablemente agruparía todos esos métodos "problemáticos" en el mismo archivo, como un ayudante. Además, para el ejemplo que proporcionó anteriormente, también usaría la
method_exists
función ( http://php.net/manual/en/function.method-exists.php ), que es menos restrictiva y más confiable.fuente