Extensión compatible con múltiples versiones


8

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::writecambió la forma en que funciona (la firma es la misma) y filePutContentapareció el método que hace algo similar a lo que writesolí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 getCurrentVersionve 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 ifo casedeclaraciones?


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 función method_exists( method_exists ( mixed $object , string $method_name )), que es menos restrictiva y más confiable.
Mayers

@Mayers. Deberías escribir esto como respuesta. Parece un enfoque válido. No es perfecto, pero sí válido :)
Marius

Respuestas:


3

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_existsfunción ( http://php.net/manual/en/function.method-exists.php ), que es menos restrictiva y más confiable.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.